(DJANGO) Как установить current.username в разделе комментариев автора - PullRequest
1 голос
/ 07 марта 2020

У меня Comment модель в моем приложении Django.

Я хочу, чтобы автор комментария был зарегистрирован как текущий author, а не как другой зарегистрированный аккаунт.

Вот скриншот , Я могу выбрать user2 учетную запись, чтобы оставить комментарий, но в настоящее время я на user1 учетной записи. enter image description here

Вот моя Django Comment модель:

class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name='comments')
    name = models.ForeignKey(User, on_delete=models.CASCADE)
    email = models.EmailField()
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=False)

    class Meta:
        ordering = ['created_on']

    def __str__(self):
        return 'Comment {} by {}'.format(self.body, self.name)

И некоторый код из html формы:

  <article class="media content-section">
    <div class="media-body">
      <!-- comments -->
      {% if comments.count == 1 %}
        <h2>{{ comments.count }} comment</h2>
      {% else %}
        <h2>{{ comments.count }} comments</h2>
      {% endif %}

      {% for comment in comments %}
      <div class="comments" style="padding: 10px;">
        <p class="font-weight-bold">
          {{ comment.name }}
          <span class=" text-muted font-weight-normal">
            {{ comment.created_on }}
          </span>
        </p>
        {{ comment.body | linebreaks }}
      </div>
      {% endfor %}
      {% if new_comment %}
      <div class="alert alert-success" role="alert">
        Your comment is awaiting moderation
      </div>
      {% else %}
      <h3>Leave a comment</h3>
      {% load crispy_forms_tags %}
      <form method="post" style="margin-top: 1.3em;">
        {{ comment_form | crispy }}
        {% csrf_token %}
        <button type="submit" class="btn btn-primary  btn-lg">Submit</button>
      </form>
      {% endif %}
    </div>
  </article>

РЕДАКТИРОВАТЬ

view.py

def post_detail(request, slug):
    template_name = 'blog/post_detail.html'
    post = get_object_or_404(Post, slug=slug)
    comments = post.comments.filter(active=True)
    new_comment = None
    # Comment posted
    if request.method == 'POST':
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            # Create Comment object but don't save to database yet
            new_comment = comment_form.save(commit=False)
            # Assign the current post to the comment
            new_comment.post = post
            # Save the comment to the database
            new_comment.save()
    else:
        comment_form = CommentForm()

    return render(request, template_name, {'posts': post,
                                           'comments': comments,
                                           'new_comment': new_comment,
                                           'comment_form': comment_form})

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Вы можете сделать поле недоступным для редактирования, установив параметр editable=&hellip; [Django -doc] в False. Кроме того, я советую использовать user и , а не name, поскольку это ссылка на объект пользователя, а не имя пользователя:

class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name='comments')
    <b>user</b> = models.ForeignKey(User<b>, editable=False</b>, on_delete=models.CASCADE)
    email = models.EmailField()
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=False)

    class Meta:
        ordering = ['created_on']

    def __str__(self):
        return 'Comment {} by {}'.format(self.body, self.user)

Тогда, на ваш взгляд если форма действительна, вы устанавливаете instance.user этой формы на request.user:

from django.contrib.auth.decorators import login_required

@login_required
def add_comment(request, post_id):
    # &hellip;
    if request.method == 'POST':
        form = CommentForm(request.POST, request.FILES)
        if form.is_valid():
            <b>form.instance.user = request.user</b>
            # &hellip;
        # &hellip;
    # &hellip;
1 голос
/ 07 марта 2020

Ну, не должно быть выбора пользователей. Для идентификации пользователя просто используйте request.user на ваш взгляд. Я не знаю, как выглядит ваш вид, но вы можете установить name так:

name = request.user
# or if you're using classes:
name = self.request.user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...