【问题标题】:local variable 'comment_form' referenced before assignment in django在 django 中赋值之前引用的局部变量“comment_form”
【发布时间】:2022-07-10 14:15:27
【问题描述】:

我创建了一个应用程序,用户可以登录并发布他想要的内容,现在我决定为用户在应用程序中所做的每个帖子添加评论部分,我按照 djangocentral 网站上的教程进行操作,但添加后它不起作用一切都进入我的应用程序,当我点击(阅读更多)时,它会在浏览器中抛出一个错误:local variable 'comment_form' referenced before assignment 如果我在 viewPhoto 视图的上下文中删除了comment_form,它在 viewPhoto 模板中什么都不显示。

型号:

class Comment(models.Model):
    post = models.ForeignKey(Photo, on_delete=models.CASCADE, related_name='comments')
    name = models.CharField(max_length=80) 
    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)  

admin.py:

from django.contrib import admin
from .models import Photo, Category, Comment

# Register your models here.
admin.site.register(Category)
admin.site.register(Photo)
@admin.register(Comment)

class CommentAdmin(admin.ModelAdmin):
    list_display = ('name', 'body', 'post', 'created_on', 'active')
    list_filter = ('active', 'created_on')
    search_fields = ('name', 'email', 'body')
    actions = ['approve_cooments']


    def approve_comment(self, request, queryset):
        queryset.update(active=True)

form.py:

from dataclasses import fields
from pyexpat import model
from .models import Comment
from django import forms


class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('name', 'email', 'body',)

view.py:

def viewPhoto(request, pk):
    post = get_object_or_404(Photo, id=pk)
    photo = Photo.objects.get(id=pk)

    template_name = 'photo.html'
    comment = post.comments.filter(active=True)
    new_comment = None


    if request.method == 'POST':
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():

            new_comment = comment_form.save(commit=False)

            new_comment.post = post

            new_comment.save()
        else:
            comment_form = CommentForm()
    return render(request, 'photo.html', {'photo': photo, 'post': post, 
    'comment':comment, 
    'new_comment': new_comment,
    'comment_form': comment_form})

查看照片模板:

<body class="m-5">
<div class="container">
     <div class="row justify-content-center">
          <div class="col">
               <div style="height: 90vh;">
                  <img style="max-width: 100%; max-height: 100%" src="{{ post.image.url }}" alt="">

                  <p>{{post.description}}</p>
                  <p>{{post.user.username.upper}}</p>
                  <p>{{post.date_added}}</p>

               </div>

          </div>
     </div>
</div>
 <div class="container">
      {% for comment in comments %}
      <p>{{ comment.name }}</p>
      <br>
      <p>{{ comment.created_on }}</p>
      <br>
      <p>{{ comment.body }}</p>
      {% endfor %}
 </div>


<div class="container">
     {% if new_comments %}
     <p>wait your comments is ready</p>

     <form method="POST"> 
          {% csrf_token %}             
          {{ comment_form.as_p }}
          <button type="submit">submit</button>
     </form>
     {% endif %}
</div>

【问题讨论】:

    标签: django django-views django-forms django-templates


    【解决方案1】:

    else 应该与if request.method == 'POST' 校验绑定,而不是与if comment_form.is_valid() 校验绑定,所以:

    from django.shortcuts import redirect
    
    def viewPhoto(request, pk):
        post = get_object_or_404(Photo, id=pk)
        photo = Photo.objects.get(id=pk)
    
        template_name = 'photo.html'
        comment = post.comments.filter(active=True)
        new_comment = None
    
    
        if request.method == 'POST':
            comment_form = CommentForm(data=request.POST)
            if comment_form.is_valid():
                comment_form.instance.post = post
                comment_form.save()
                return redirect('name-of-some-view')
        else:
            comment_form = CommentForm()
        return render(request, 'photo.html', {'photo': photo, 'post': post, 
        'comment':comment, 
        'new_comment': new_comment,
        'comment_form': comment_form})

    注意:如果 POST 请求成功,请发送redirect [Django-doc] 实施Post/Redirect/Get pattern [wiki]。 这样可以避免在用户刷新时发出相同的 POST 请求 浏览器。

    【讨论】:

    • 在我将它添加到我的视图后实际上它不起作用,然后我在 view.py 文件中创建了一个 cmets 视图并复制代码并将其粘贴到新的 cmets 视图中,它会将我重定向到添加评论模板,但是当我添加新的 cmets 时,它工作正常并添加到管理员中,但是 cmets 没有显示在 viewphoto 模板中,我该如何解决这个问题?
    • viewphoto 模板未显示用户 cmets
    • @AdamuAbdulkarim:active 的默认值为 False,但您的 comment = ... 仅检索带有 active=True 的 cmets...
    • 那么,先生,我现在该怎么办?我需要改变哪里
    • @AdamuAbdulkarim:这取决于您要实现的业务逻辑。如果您想在不激活的情况下显示添加的评论,请将default=True 设置为active 字段。
    猜你喜欢
    • 2021-04-27
    • 2016-07-18
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2020-05-05
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多