2009-07-22 19 views
6

(Ora che Django 1.1 è in stato di rilascio, potrebbe essere un buon momento per chiedere questo.)Commenti autentificati in Django 1.1?

Sono stato bruciante ovunque per modi di estendere l'app commenti di Django per supportare commenti autenticati. Dopo aver letto alcune volte il modello dei commenti, ho rilevato che esiste già ForeignKey su User.

Da django.contrib.comments.models:

class Comment(BaseCommentAbstractModel): 
    """ 
    A user comment about some object. 
    """ 

    # Who posted this comment? If ``user`` is set then it was an authenticated 
    # user; otherwise at least user_name should have been set and the comment 
    # was posted by a non-authenticated user. 
    user  = models.ForeignKey(User, verbose_name=_('user'), 
        blank=True, null=True, related_name="%(class)s_comments") 
    user_name = models.CharField(_("user's name"), max_length=50, blank=True) 
    user_email = models.EmailField(_("user's email address"), blank=True) 
    user_url = models.URLField(_("user's URL"), blank=True) 

io non riesco a ottenere la mia testa intorno impostazione user. Se uso commenti così come sono, anche se sono autenticato, sembra che richieda gli altri campi. Immagino che dovrei scavalcare il modulo e farlo lì? Inoltre, se utilizzo user, dovrei ignorare il fatto che user_name, user_email e user_url saranno vuoti e semplicemente estrarre tali informazioni da un modello di profilo correlato, corretto?

Mentre le risposte potrebbero essere piuttosto banali, alla fine, sono solo sorpreso che non sia stato scritto o addirittura parlato.

risposta

1

Utilizzare un modello Profilo per ulteriori dati dell'account oltre a nome utente e password. È possibile chiamare user.get_profile() se si include questa linea in profilo:

user = models.ForeignKey(User, unique=True) 

e questa linea in settings.py:

AUTH_PROFILE_MODULE = 'yourapp.Profile' 
+0

Grazie, anche se so come prelevare le informazioni dal modello del profilo. Ti capita di avere qualche idea su come passare '' utente'' nel commento? –

0

accordo con il commento, è aut-aut: l'altro i campi devono essere utilizzati quando usernon è impostato. Hai controllato che le colonne rilevanti siano decisamente NOT NULL? Sono contrassegnati come blank=True che normalmente significa required=False a livello di campo. Se hai effettivamente provato, quali errori stai ottenendo?

1

Prima di tutto, l'app per commenti supporta già sia utenti autenticati che anonimi, quindi presumo che vogliate accettare solo commenti da utenti autenticati?

Thejaswi Puthraya aveva uno series di articles sul suo blog che parlava di questo. Fondamentalmente, precompila i campi name e email nel modulo di commento e li sostituisce con campi nascosti, quindi definisce una vista wrapper attorno a post_comment per garantire che l'utente che pubblica il commento sia lo stesso dell'utente che ha effettuato l'accesso, tra le altre cose. Sembrava piuttosto semplice, anche se forse un po 'noioso.

Il suo blog sembra essere in ritardo al momento ... speriamo che sia solo temporaneo.

3

Mi raccomando che quando ti viene una domanda sugli interni di Django, dai un'occhiata alla fonte.

Se guardiamo allo start of post_comment view vediamo che il POST querydict viene copiato e l'e-mail e il nome dell'utente sono stati inseriti. Sono ancora necessari (come visto nello form's source), quindi questi dettagli devono essere inseriti nel modulo o l'utente deve fornirli.

Per rispondere alla domanda in Superjoe, la vista attacca l'utente al commento prima che venga salvato (come visto near the end of the post_comment view).

+0

Grazie Chris, per qualche motivo ho continuato a cercare me stesso guardando le modelle invece delle viste. Quindi posso tecnicamente usare 'exclude()' su un modulo sottoclasse e rimuovere i campi nome, email e URL e funzionerà come è? Vale la pena provare, grazie ancora. :) –

+0

Sì, "exclude = (...)" oppure potresti fare la logica in '__init__' del tuo modulo, passare l'utente e spuntare i campi se l'utente è autenticato. – SmileyChris

4

WordPress e altri sistemi fanno di questo un gioco da ragazzi. Se hai effettuato l'accesso, il modulo di commento dovrebbe solo "fare la cosa giusta" e rimuovere i campi nome/email/url. Non è esattamente questo il tipo di sollevamento pesante che una struttura dovrebbe fare per te?

Piuttosto che ballare con modelli di sottoclassi per qualcosa che dovrebbe essere banalmente facile, trovo più semplice costruire manualmente il modulo nel modello e fornire i valori del campo nascosto di cui ha bisogno. Questo funziona perfettamente per i siti che accettano solo i commenti da parte degli utenti autenticati:

{% if user.is_authenticated %} 
{% get_comment_form for [object] as form %} 
<form action="{% comment_form_target %}" method="POST"> 
    {% csrf_token %} 
    {{ form.comment }} 
    {{ form.honeypot }} 
    {{ form.content_type }} 
    {{ form.object_pk }} 
    {{ form.timestamp }} 
    {{ form.security_hash }} 
    <input type="hidden" name="next" value="{% url [the_view] [object].id %}" /> 
    <input type="submit" value="Add comment" id="id_submit" /> 
</form> 
{% else %} 
    <p>Please <a href="{% url auth_login %}">log in</a> to leave a comment.</p> 
{% endif %} 

Si noti che questo lascerà il campo honeypot visibile; ti consigliamo di nasconderlo nel CSS:

#id_honeypot { 
    visibility:hidden; 
} 

Se si desidera attivare commenti sia per gli utenti anonimi o autenticati, sostituire la linea auth_login di cui sopra con una chiamata standard a un modulo di commento.