Wagh
Wagh

Reputation: 4306

while submitting data in first form blank object is getting created for second form django

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']

crave.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>

i want to submit data of form one only, but the thing is happening that for form2 i.e. for comment blank object is getting created, its due to a foriegn key i given in comment class. i dont want the blank object getting created for form2. The data should get saved for form2 after clicking on the submit button of form2. And i can not remove foreign key relationship from there also. reply should get submitted for that relative crave only. and data should get submitted independantlly.

I dont want data to be saved for both form after clicking on submit button of one form.

Upvotes: 0

Views: 171

Answers (2)

Eugene Soldatov
Eugene Soldatov

Reputation: 10145

You shouldn't use one view function for two different actions.

You should do view for add/edit Crave objects like this:

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})

Once again, you shouldn't mix add/edit Crave with add comments. You can't add comment to non-exist entity:

@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})

And please note that names for models should be capitalised, without underlines - "crave_data" is bad style

Upvotes: 1

dhana
dhana

Reputation: 6525

You can make the foreign key field optional in Django model

Try this way,

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

If you want submit the forms independently. then put the hidden input field in one form and separate the form logic in view based on hidden input. Like this,

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

Upvotes: 0

Related Questions