【问题标题】:while submitting data in first form blank object is getting created for second form django在为第二种形式 django 创建第一种形式的空白对象时
【发布时间】:2014-06-01 12:05:22
【问题描述】:

views.py

def crave_view(request):
    if (request.method=="POST"):

        form1=CraveDataForm(request.POST, request.FILES)

        form2 = CraveReplyForm(request.POST, request.FILES)
        print form1
        print form2

        if form1.is_valid() and form2.is_valid():

            crave_made = form1.save(commit=False)
            crave_made.person = request.user
            crave_made.save()  
            reply = form2.save(commit=False)
            reply.person=request.user
            reply.crave = crave_made
            reply.save()

            #login(request,crave_made.username,form1.clean_password2())
            messages.success(request, 'You Registered Successfully')

            #return HttpResponseRedirect('/details/')
        else:
            print form1
            print form2

            messages.error(request, 'Please enter all required fields')                     
    else:                    
        form2 = CraveReplyForm()
        form1=CraveDataForm()  


    return render(request, "crave/crave.html", { 'form1' : form1, 'form2' : form2 })

models.py

class crave_data(models.Model):
    person = models.ForeignKey(User)
    post=models.TextField(blank = True,null = True)
    date= models.DateTimeField(auto_now_add=True, blank=True)
    def __unicode__(self):
        return self.post



class comments(models.Model):

    crave=models.ForeignKey(crave_data)
    reply=models.CharField(max_length=1000, blank = True,null = True)
    date= models.DateTimeField(auto_now_add=True, blank=True)
    def __unicode__(self):
        return self.reply

forms.py

class CraveDataForm(forms.ModelForm):
    class Meta:
        model = crave_data
        exclude=['date', 'password1', 'password2', 'username', 'person']

class CraveReplyForm(forms.ModelForm):
    class Meta:
        model = comments
        exclude=['date', 'crave', 'password1', 'password2', 'username']

渴望.html

<form class="horizontal-form" role="form" action="." method="post"  style="padding: 10px;">
           {% csrf_token %}
                <div class="form-group" >


                        <div class="col-sm-10">
                        {{ form1.post.label_tag }}{{ form1.post }} <br /><br>   
                        </div>
                        </div>      
                        <input type="submit" class="btn btn-success" value="crave" />
                    </form>


        <form class="horizontal-form" role="form" action="." method="post"  style="padding: 10px;">
           {% csrf_token %}
                <div class="form-group" >
                        <div class="col-sm-10">
                        {{ form2.reply.label_tag }} {{ form2.reply }}   </br> </br>
                    </div>
                    </div>
                    <input type="submit" class="btn btn-success" value="reply" />
        </form>

我只想提交表单一的数据,但事情正在发生,对于 form2,即创建评论空白对象,这是由于我在评论类中给出的外键。 我不希望为 form2 创建空白对象。单击form2的提交按钮后,数据应保存为form2。而且我也无法从那里删除外键关系。回复应该仅针对该相对渴望提交。并且数据应该独立提交。

我不希望在单击一个表单的提交按钮后为两个表单保存数据。

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    您不应该将一个视图函数用于两种不同的操作。

    您应该像这样查看添加/编辑 Crave 对象:

    from django.shortcuts import get_object_or_404
    from django.core.exceptions import PermissionDenied
    from django.contrib.auth.decorators import login_required
    
    @login_required
    def crave_edit(request, id=None):
        instance = get_object_or_404(crave_data, pk=id) if id else None
        if instance and instance.person != request.user:
            raise PermissionDenied()
        if request.method=="POST":
            form=CraveDataForm(request.POST, request.FILES, instance=instance)
            if form.is_valid():
                crave_made = form.save(commit=False)
                crave_made.person = request.user
                crave_made.save()                    
        else:                    
            form=CraveDataForm(instance=instance)  
    
        return render(request, "crave/crave_edit.html", {'form' : form})
    

    再次强调,您不应将添加/编辑 Crave 与添加 cmets 混用。您不能向不存在的实体添加评论:

    @login_required
    def crave_view(request, id):
        crave = get_object_or_404(crave_data, pk=id)
        if request.method=="POST":
            form=CraveReplyForm(request.POST, request.FILES)
            if form.is_valid():
                reply = form.save(commit=False)
                reply.person=request.user
                reply.crave = crave
                reply.save()                    
        else:                    
            form=CraveReplyForm()  
    
        return render(request, "crave/crave_view.html", {'crave': crave, 'form' : form})
    

    请注意,模型的名称应该大写,没有下划线 - “crave_data”是不好的风格

    【讨论】:

    • 不,我只想在单页上发布和评论,,,,,,,,,
    • 我可以在bot视图中渲染到相同的模板吗?
    • 是的,你可以做到。它将是两个视图函数,每个进程自己的表单,如果 request.METHOD 不是 POST 生成两个空表单。
    • 你能发布答案吗,,,, 很抱歉打扰你,但我对 django 很陌生
    • 嘿,我得到了这个错误 crave_view() 正好需要 2 个参数(1 个给定)
    【解决方案2】:

    您可以在 Django 模型中将外键字段设为可选

    试试这个方法,

    crave=models.ForeignKey(crave_data, blank=True, null=True)
    

    如果您想独立提交表单。然后将隐藏的输入字段放在一个表单中,并根据隐藏的输入在视图中分离表单逻辑。像这样,

    if 'hidden_input' in request.POST.keys(): 
    

    【讨论】:

      猜你喜欢
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多