【问题标题】:Django Blog comment author referenceDjango 博客评论作者参考
【发布时间】:2020-04-27 17:24:59
【问题描述】:

我构建了一个带有评论部分的小型 Django 博客应用程序。用户必须先登录才能发表帖子或发表评论。我想在我的模板中的博客文章和 cmets 中返回我的 CustomUser全名。博客帖子后,全名按预期返回,但评论的作者返回我的 CustomUser 模型的 username field 的值,即 None强>。请帮忙。这是我的代码。

CustomUser 模型

from django.contrib.auth.models import AbstractUser
from django.db import models
from . manager import CustomUserManager

class CustomUser(AbstractUser):
    email           = models.EmailField(verbose_name = 'email address', unique=True)
    username        = None
    first_name      = models.CharField(verbose_name = 'first_name', blank = True, max_length = 30)
    last_name       = models.CharField(verbose_name = 'last_name', blank = True, max_length = 30)
    bio             = models.CharField(max_length = 150, null = True, blank = True)
    avatar          = models.ImageField(upload_to = 'avatars', null = True, blank = True)
    date_joined     = models.DateTimeField(auto_now_add = True)
    last_login      = models.DateTimeField(auto_now_add = True)     

    def __str__(self):
        return self.first_name + " " + self.last_name

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

博客模式

from django.conf import settings
from django.db import models
from django.urls import reverse
from django.contrib.auth import get_user_model



class Post(models.Model):
    title = models.CharField(max_length=200)
    slug   = models.SlugField(max_length = 200, unique = True)
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name = 'blog_posts',
        )
    post_picture = models.ImageField(upload_to = 'post_picture', null = True, blank = True)
    approved_comment = models.BooleanField(default=True)

    def approve(self):
        self.approved_comment = True
        self.save()

    class Meta:
        ordering = ['created_on']

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post_detail', args=[str(self.id)])

    def approved_comments(self):
        return self.comments.filter(approved_comment = True)

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    author = models.ForeignKey(
                settings.AUTH_USER_MODEL,
                on_delete=models.CASCADE,
                related_name = 'blog_comments',
                null = True,
    )
    text = models.CharField(max_length = 300,)
    created_date = models.DateTimeField(auto_now_add = True)
    approved_comment = models.BooleanField(default=True)

    def approve(self):
        self.approved_comment = True
        self.save()

    def __str__(self):
        return self.text

查看

from django.views.generic import ListView, DetailView, CreateView
from django.views.generic.edit import UpdateView, DeleteView, FormView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from . models import Post, Comment
from .forms import PostForm, CommentForm
from django.shortcuts import get_object_or_404, render, redirect
from django.contrib.auth.decorators import login_required

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    template_name = 'post_new.html'
    fields = ['title', 'body',]
    login_url = 'login'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

class PostListView(ListView):
    model = Post
    template_name = 'post_list.html'

    def get_queryset(self):
        return Post.objects.order_by('created_on').reverse()


class PostDetailView(DetailView):
    model = Post
    template_name = 'post_detail.html'

class PostUpdateView(LoginRequiredMixin, UpdateView):
    model = Post
    fields = ['title', 'body', ]
    template_name = 'post_edit.html'
    login_url = 'login'

class PostDeleteView(LoginRequiredMixin, DeleteView):
    model = Post
    template_name = 'post_delete.html'
    success_url = reverse_lazy('post_list')
    login_url = 'login'

def add_comment_to_post(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = post
            comment.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = CommentForm()
    return render(request, 'add_comment_to_post.html', {'form': form})

@login_required
def comment_approve(request, pk):
    comment = get_object_or_404(Comment, pk=pk)
    comment.approve()
    return redirect('post_detail', pk=comment.post.pk)

@login_required
def comment_remove(request, pk):
    comment = get_object_or_404(Comment, pk=pk)
    comment.delete()
    return redirect('post_detail', pk=comment.post.pk)

模板

{% extends 'blog_template.html' %}
{% load static %}
{% load widget_tweaks %}


{% block blog_center %}
    <div class="post-entry">
        <h2>{{ object.title }}</h2>
        <p>by {{ object.author }} | {{ object.date }}</p>
        <p>{{ object.body }}</p>
    </div>
        <p>Back to <a href="{% url 'post_list' %}">All Posts</a>.</p>

    {% if user.is_authenticated %}
        <a class="" href="{% url 'add_comment_to_post' pk=post.pk %}">Add comment</a>  
    {% else %}
        <a href="{% url 'login' %}">Log In</a>
    {% endif %}

    {% for comment in post.comments.all %}
        {% if user.is_authenticated or comment.approved_comment %}
            <div class="">
                <div class="">
                    {{ comment.created_date }}
                    {% if not comment.approved_comment %}

                        <a class="btn btn-default" href="{% url 'comment_remove' pk=comment.pk %}"><span class="glyphicon glyphicon-remove"></span></a>
                        <a class="btn btn-default" href="{% url 'comment_approve' pk=comment.pk %}"><span class="glyphicon glyphicon-ok"></span></a>
                    {% endif %}            
                </div>
                <p>{{ comment.author }}</p>
                <p>{{ comment.text|linebreaks }}</p>
            </div>
        {% endif %}       
    {% empty %}
            <p>No comments here yet :</p>
    {% endfor %}
{% endblock blog_center %}

【问题讨论】:

    标签: comments blogs django-custom-user


    【解决方案1】:

    我不知道是什么原因造成的,但我实现了另一种方法,它奏效了。

    我首先在我的评论模型中创建了一个 CharField。

    然后,在验证表单后,我将 request.user 分配给我视图中的该字段。然后我将它保存到数据库中。

    然后我返回模板中的值。 这是我更新的代码。

    models.py

    ​​>
    from django.conf import settings
    from django.db import models
    from django.urls import reverse
    from django.contrib.auth import get_user_model
    
    
    class Post(models.Model):
        title           = models.CharField(max_length=200)
        slug            = models.SlugField(max_length = 200, unique = True)
        body            = models.TextField()
        created_on      = models.DateTimeField(auto_now_add=True)
        author          = models.ForeignKey(
                            settings.AUTH_USER_MODEL,
                            on_delete=models.CASCADE,
                            related_name = 'blog_posts',
                            )
        post_picture    = models.ImageField(
                            upload_to = 'post_picture', 
                            null = True, 
                            blank = True,
                            )
        approved_comment = models.BooleanField(default=True)
    
        def approve(self):
            self.approved_comment = True
            self.save()
    
        class Meta:
            ordering = ['created_on']
    
        def __str__(self):
            return self.title
    
        def get_absolute_url(self):
            return reverse('post_detail', args=[str(self.id)])
    
        def approved_comments(self):
            return self.comments.filter(approved_comment = True)
    
    class Comment(models.Model):
        post                    = models.ForeignKey(
                                    Post, 
                                    on_delete=models.CASCADE, 
                                    related_name='comments'
                                    )
        comment_author          = models.CharField(max_length = 200, null = True)
        text                    = models.CharField(max_length = 300,)
        created_date            = models.DateTimeField(auto_now_add = True)
        approved_comment        = models.BooleanField(default=True)
    
        def approve(self):
            self.approved_comment = True
            self.save()
    
        def __str__(self):
            return self.text
    

    views.py

    ​​>
    from django.views.generic import ListView, DetailView, CreateView
    from django.views.generic.edit import UpdateView, DeleteView, FormView
    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.urls import reverse_lazy
    from . models import Post, Comment
    from .forms import PostForm, CommentForm
    from django.shortcuts import get_object_or_404, render, redirect
    from django.contrib.auth.decorators import login_required
    
    class PostCreateView(LoginRequiredMixin, CreateView):
        model = Post
        template_name = 'post_new.html'
        fields = ['title', 'body',]
        login_url = 'login'
    
        def form_valid(self, form):
            form.instance.author = self.request.user
            return super().form_valid(form)
    
    class PostListView(ListView):
        model = Post
        template_name = 'post_list.html'
    
        def get_queryset(self):
            return Post.objects.order_by('created_on').reverse()
    
    
    class PostDetailView(DetailView):
        model = Post
        template_name = 'post_detail.html'
    
    class PostUpdateView(LoginRequiredMixin, UpdateView):
        model = Post
        fields = ['title', 'body', ]
        template_name = 'post_edit.html'
        login_url = 'login'
    
    class PostDeleteView(LoginRequiredMixin, DeleteView):
        model = Post
        template_name = 'post_delete.html'
        success_url = reverse_lazy('post_list')
        login_url = 'login'
    
    def add_comment_to_post(request, pk):
        post = get_object_or_404(Post, pk=pk)
        if request.method == "POST":
            form = CommentForm(request.POST)
            if form.is_valid():
                comment = form.save(commit=False)
                comment.post = post
                comment.comment_author = request.user
                comment.save()
                return redirect('post_detail', pk=post.pk)
        else:
            form = CommentForm()
        return render(request, 'add_comment_to_post.html', {'form': form})
    
    @login_required
    def comment_approve(request, pk):
        comment = get_object_or_404(Comment, pk=pk)
        comment.approve()
        return redirect('post_detail', pk=comment.post.pk)
    
    @login_required
    def comment_remove(request, pk):
        comment = get_object_or_404(Comment, pk=pk)
        comment.delete()
        return redirect('post_detail', pk=comment.post.pk)
    

    模板

    {% extends 'blog_template.html' %}
    {% load static %}
    {% load widget_tweaks %}
    
    
    {% block blog_center %}
        <div class="post-entry">
            <h2>{{ object.title }}</h2>
            <p>by {{ object.author }} | {{ object.created_on }}</p>
            <p>{{ object.body }}</p>
        </div>
            <p>Back to <a href="{% url 'post_list' %}">All Posts</a>.</p>
    
        {% if user.is_authenticated %}
            <a class="" href="{% url 'add_comment_to_post' pk=post.pk %}">Add comment</a>  
        {% else %}
            <a href="{% url 'login' %}">Log In</a>
        {% endif %}
    
        {% for comment in post.comments.all %}
            {% if user.is_authenticated or comment.approved_comment %}
                <div class="">
                    <div class="">
                        {{ comment.created_date }}
                        {% if not comment.approved_comment %}
    
                            <a class="btn btn-default" href="{% url 'comment_remove' pk=comment.pk %}"><span class="glyphicon glyphicon-remove"></span></a>
                            <a class="btn btn-default" href="{% url 'comment_approve' pk=comment.pk %}"><span class="glyphicon glyphicon-ok"></span></a>
                        {% endif %}            
                    </div>
                    {{ comment.comment_author }} 
                    {{ comment.text|linebreaks }}
                </div>
            {% endif %}       
        {% empty %}
                <p>No comments here yet :</p>
        {% endfor %}
    {% endblock blog_center %}
    

    【讨论】:

      猜你喜欢
      • 2021-04-16
      • 2013-11-21
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 2012-02-29
      • 2013-04-16
      • 2020-06-01
      • 2015-12-10
      相关资源
      最近更新 更多