【问题标题】:how to work with Multiple forms in django Detailview如何在 django Detailview 中使用多个表单
【发布时间】:2020-01-07 16:31:00
【问题描述】:

我在 django 博客中有一个评论部分,有两种形式,一种是评论,另一种是回复评论,但评论表单工作正常,回复表单不起作用!我试图做,但得到错误... /page/9/ 处的 IntegrityError FOREIGN KEY 约束失败...

感谢您的帮助 :) 谢谢。

views.py
class PostDetailView(DetailView):
model = Post
template_name = "post_detail.html"
context_object_name = 'post'
form = CommentForm()

def get_object(self):
    obj = super().get_object()
    if self.request.user.is_authenticated:
        PostView.objects.get_or_create(
            user=self.request.user,
            post=obj
        )
    return obj

def get_context_data(self, **kwargs):
    category_count = get_category_count()
    most_recent = Post.objects.order_by('-timestamp')[:3]
    context = super().get_context_data(**kwargs)
    context['most_recent'] = most_recent
    context['page_request_var'] = "page"
    context['category_count'] = category_count
    context['form'] = self.form
    return context



def post(self, request, *args, **kwargs):
    form = CommentForm(request.POST)

    form = ReplyForm(request.POST)# how to work with this form like above from 

    if form.is_valid():
        post = self.get_object()
        form.instance.user = request.user
        form.instance.post = post
        form.save()
        return redirect(reverse("post-detail", kwargs={
            'pk': post.pk
        }))

  models.py

class Reply(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)
    content = models.TextField()
    comment = models.ForeignKey('Comment', related_name='replies',default=False, null=True, 
                                     on_delete=models.CASCADE)

    def __str__(self):
         return self.content

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)
    content = models.TextField()
    post = models.ForeignKey('Post', related_name='comments', default=False, 
                              on_delete=models.CASCADE)

    def __str__(self):
         return self.content

【问题讨论】:

  • 你在post(大纲代码?)中重新定义/丢失了form,但这并不能解释IntegrityError。您需要详细阅读错误以找出导致该错误的 DB 表中的哪个字段的无效值。
  • 它确实解释了完整性错误:您正在保存 ReplyForm 实例(form 是您的 ReplyForm)而不分配 comment 字段,因为您认为它是 CommentForm。
  • 兄弟,我该如何为 ReplyFrom 做到这一点,就像我 di commentFrom 一样?有什么方法可以在该 DetailView 中使用这两种形式? @dirkgroten

标签: python django django-models django-forms django-views


【解决方案1】:

如果您不费力地试图说服基于类的视图做它不打算做的事情,而是使用一个普通的旧的基于函数的视图,您可能会发现它更容易。

这是一个两种形式的视图。代码已被重构为我认为更好的模式,以验证两个表单并在顶部出现任何错误时重新显示,然后您只需执行实际工作来创建和保存底部的对象。

def receive_uncoated( request): #Function based view

    # let's put form instantiation in one place not two, and reverse the usual test. This
    # makes for a much nicer layout with actions not sandwiched by "boilerplate" 
    # note any([ ]) forces invocation of both .is_valid() methods 
    # so errors in second form get shown even in presence of errors in first

    args = [request.POST, ] if request.method == "POST" else []
    batchform = CreateUncWaferBatchForm( *args )
    po_form =  CreateUncWaferPOForm(     *args, prefix='po')
    if request.method != "POST" or any(  
        [ not batchform.is_valid(), not po_form.is_valid() ]):

        return render(request, 'wafers/receive_uncoated.html',   # can get this out of the way at the top
            {'batchform': batchform,  
            'po_form': po_form, 
        })

    #POST, everything is valid, do the work

    # create and save some objects based on the validated forms ... 

    return redirect( 'wafers:ok' )   

【讨论】:

  • 兄弟,我没听懂,你能编辑那个代码吗?实际上如何使它按我的意愿工作....谢谢兄弟
猜你喜欢
  • 2015-08-25
  • 2016-10-24
  • 2018-01-21
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 2023-03-07
  • 2015-06-08
  • 2021-11-27
相关资源
最近更新 更多