Question

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.

Was it helpful?

Solution

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

OTHER TIPS

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(): 
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top