2009-07-22 26 views
6

(Ahora que Django 1.1 está en estado de candidato de lanzamiento, podría ser un buen momento para preguntar esto)Comentarios autenticados en Django 1.1?

He estado buscando en todas partes formas de ampliar la aplicación de comentarios de Django para admitir comentarios autenticados. Después de leer algunas veces el modelo de comentarios, descubrí que ya existe un ForeignKey a User.

De 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) 

Parece que no puedo conseguir mi cabeza alrededor de la configuración user. Si uso los comentarios como están, incluso si estoy autenticado, todavía parece requerir los otros campos. ¿Supongo que debería anular el formulario y hacerlo allí? Además de eso, si uso user, debería ignorar el hecho de que user_name, user_email y user_url estarán vacíos y simplemente extraerá esa información de un modelo de perfil relacionado, ¿correcto?

Si bien las respuestas pueden ser bastante triviales al final, estoy sorprendido de que no se haya escrito o incluso se haya hablado.

Respuesta

1

Utilice un modelo de perfil para obtener datos de cuenta adicionales además del nombre de usuario y la contraseña. Puede llamar user.get_profile() si se incluyen en esta línea Perfil:

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

y esta línea en settings.py:

AUTH_PROFILE_MODULE = 'yourapp.Profile' 
+0

Gracias, aunque sé cómo obtener la información del modelo de perfil. ¿Tendría alguna idea sobre pasar '' user'' al comentario? –

0

De acuerdo con el comentario, es lo uno o: el otro los campos están destinados a ser utilizados cuando userno es conjunto. ¿Has verificado que las columnas relevantes definitivamente NO SON NULAS? Están marcados como blank=True que normalmente significa required=False en el nivel de campo. Si realmente lo has probado, ¿qué errores estás obteniendo?

1

En primer lugar, la aplicación de comentarios ya admite usuarios autenticados y anónimos, por lo que supongo que desea aceptar los comentarios de usuarios autenticados solamente.

Thejaswi Puthraya tenía series de articles en su blog que trata esto. Básicamente, rellena previamente los campos name y email en el formulario de comentarios y los reemplaza con campos ocultos, luego define una vista de contenedor alrededor de post_comment para garantizar que el usuario que publique el comentario sea el mismo que el usuario que inició sesión, entre otras cosas. Parecía bastante sencillo, aunque tal vez un poco tedioso.

Parece que su blog ya no funciona ... espero que solo sea temporal.

3

Te recomiendo que cuando se te ocurra una pregunta acerca de las partes internas de Django, eches un vistazo a la fuente.

Si miramos el start of post_comment view vemos que el queryDER POST se copia y el correo electrónico y el nombre del usuario se insertan. Todavía se requieren (como se ve en el form's source), por lo que estos detalles deben ingresarse en el formulario o el usuario debe proporcionarlos.

Para responder a su pregunta sobre Superjoe, la vista asocia al usuario al comentario antes de guardarlo (como se ve en near the end of the post_comment view).

+0

Gracias Chris, por alguna razón, seguí encontrando a mí mismo mirando los modelos en lugar de las vistas. Entonces, ¿puedo usar técnicamente 'exclude()' en un formulario subclasificado y eliminar el nombre, el correo electrónico y los campos URL y funcionará como está? Vale la pena intentarlo, gracias de nuevo. :) –

+0

Sí, cualquiera 'exclude = (...)' o puede hacer la lógica en el '__init__' de su formulario, transfiriendo el usuario y abriendo los campos si el usuario está autenticado. – SmileyChris

4

WordPress y otros sistemas de hacer de esto una obviedad. Si ha iniciado sesión, el formulario de comentarios debe simplemente "hacer lo correcto" y eliminar los campos de nombre/correo electrónico/url. ¿No es exactamente el tipo de trabajo pesado que un marco debe hacer por usted?

En lugar de bailar con modelos de subclases para algo que debería ser trivialmente fácil, me resulta más sencillo crear el formulario manualmente en la plantilla y proporcionar los valores de campo ocultos que necesita. Esto funciona perfectamente para los sitios que sólo aceptan los comentarios de los usuarios autenticados:

{% 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 %} 

Tenga en cuenta que esto dejará el campo honeypot visible; usted querrá esconderlo en tu CSS:

#id_honeypot { 
    visibility:hidden; 
} 

Si desea habilitar los comentarios ya sea para los usuarios anónimos o autenticados, reemplace la línea auth_login anterior con una llamada estándar a un formulario de comentarios.

Cuestiones relacionadas