【问题标题】:Form is not displaying表格不显示
【发布时间】:2021-05-29 18:00:57
【问题描述】:

我有 2 个视图,DetailView 显示帖子数据,CreateView 正在创建对该帖子的评论。问题是我的模板没有呈现任何评论表单,并且我的控制台中没有错误,我不知道为什么这不起作用。难道我做错了什么?如果是,我可以以不同的方式实施吗?如果是,我应该使用什么?提前谢谢你:)

查看代码:

class PostDetailView(LoginRequiredMixin, DetailView):
    model = Post
    context_object_name = 'post'
    template_name = 'post/details.html'


class CommentCreate(LoginRequiredMixin, CreateView):
    model = Comment
    form_class = CommentCreationForm
    context_object_name = 'forma'
    template_name = 'post/details.html'

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

details.html 模板代码:

{% extends 'base.html' %}
{% load static %}

{% block content %}
    <h1>POST</h1>
    {{ post.content }}
    <hr>
    <form action="" method="post">
        {% csrf_token %}
        {{ form }}
        <button class="btn btn-default" type="submit">Comment</button>

    </form>
{% endblock content %}

意见表:

class CommentCreationForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('text', )

评论模型:

class Comment(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

    text = models.TextField()
    date_posted = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.id)

【问题讨论】:

  • 它将始终使用 one 视图。一种常见的误解是,您以某种方式呈现模板,并且视图“订阅”了该模板。情况恰恰相反。所以你DetailView确实包含任何形式。

标签: python django django-views django-templates django-class-based-views


【解决方案1】:

我通常用函数而不是类来做

这是我的示例代码:

views.py:(在所有帖子浏览之后)

@login_required
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,'blog/comment_form.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)
    post_pk = comment.post.pk
    comment.delete()
    return redirect('post_detail',pk=post_pk)

models.py:

class Post(models.Model):
    author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
    title = models.CharField(max_length = 50)
    text = models.CharField(max_length=500)
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_time = timezone.now()
        self.save()

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


    def get_absolute_url(self):
        return reverse("post_detail",kwargs={'pk':self.pk})


    def __str__(self):
        return self.title




class Comment(models.Model):       

 post=
models.ForeignKey('blog.Post',related_name='comments',on_delete=models.CASCAD)
    author = models.CharField(max_length=16)
    text = models.CharField(max_length=220)
    created_date = models.DateTimeField(default=timezone.now)
    approved_comment = models.BooleanField(default=False)

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

    def get_absolute_url(self):
        return reverse('post_list')

    def __str__(self):
        return self.text

【讨论】:

  • 我知道如何使用函数视图,但也感谢您抽出宝贵时间 :)
【解决方案2】:

如果您提出请求,您总是会触发一个视图。该视图可以呈现零个、一个或多个模板来生成 HTTP 响应,但它根本不需要任何模板。模板只是一种更方便生成 HTML 的机制。

如果您因此向DetailView 发出请求,那么这将以某种方式包含CreateView,它只会让DetailView 决定应该做什么来生成响应在这种情况下,它正在呈现一个模板。

不过,您可以轻松地使用FormMixin [Django-doc]渲染表单:

from django.views.generic.edit import FormMixin

class PostDetailView(FormMixin, LoginRequiredMixin, DetailView):
    model = Post
    form_class = CommentCreationForm
    context_object_name = 'post'
    template_name = 'post/details.html'

    def post(self, request, *args, **kwargs):
        form = self.get_form()
        self.object = self.get_object()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

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

因此,我们在这里使用 mixin 来处理创建表单并将其传递给上下文的逻辑。我们必须实现post 方法,该方法将检查表单是否有效,如果有效,则将authorpost 添加到封装在表单中的实例中。


注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation

【讨论】:

  • 非常感谢!这真的很有帮助
猜你喜欢
  • 2012-09-15
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多