LukasKawerau
LukasKawerau

Reputation: 1071

Multiple forms on one page - one not working: Django

I am trying to have two forms on a (paginated) page.
They display just fine if I hit "save" on relevance_form, I can see this change in the admin. For event_form, however, nothing happens and after days of trying to figure it out and not finding an answer, I'm posting it here:
Why is my EventRecordForm not being submitted?

Here are my Form classes:

class EventRecordForm(ModelForm):
"""docstring for EventRecordForm"""
def __init__(self, *args, **kwargs):
        super(EventRecordForm, self).__init__(*args, **kwargs)
        self.fields['event_date'].required = True
        self.fields['location'].required = True
        self.fields['anti_gov'].required = True

class Meta:
    model = EventRecord
    exclude = ('article', 'coder', 'last_updated','country',)

def __unicode__(self):
    return u'EventRecordForm'

class RelevanceCodingRecordForm(ModelForm):
    """(ArticleMetaInfoRecordForm description)"""
    class Meta:
        model = RelevanceCodingRecord
        exclude = ('article', 'coder', 'coding_date','last_updated',
        'screened', 'classified',)

    def __unicode__(self):
        return u"RelevanceCodingRecordForm"

My View:

def assignment(request, pk):
    """View for each assignment"""
    if request.user.is_authenticated():

        #### Get correct articles
        assignment = get_object_or_404(Assignment, pk=pk)
        country = assignment.country.ccode
        start_date = assignment.start_date
        end_date = assignment.end_date
        articles = Article.objects.filter(country=country).filter(pub_date__range=(start_date,end_date))
        paginator = Paginator(articles, 1)

        #### Pagination ####
        page = request.GET.get('page')
        try:
            articles = paginator.page(page)
        except PageNotAnInteger:
            articles = paginator.page(1)
        except EmptryPage:
            articles = paginator(page(paginator.num_pages))

        #### Forms ####
        if request.method == 'POST':
            if 'event' in request.POST:
                event_form = EventRecordForm(request.POST, prefix='event')
                if event_form.is_valid():
                    obj = event_form.save(commit=False)
                    obj.article = paginator.page(page).object_list[0]
                    # obj.classified = True need to figure this out
                    obj.coder = request.user.coder
                    obj.country = paginator.page(page).object_list[0].country
                    obj.save()
                    redirect_to = "?page=%s" % page
                   # return HttpResponseRedirect(redirect_to)
                    return HttpResponseRedirect(reverse ('coding:assignment', args=(pk,)))
                relevance_form = RelevanceCodingRecordForm(prefix='relevance')
            elif 'relevance' in request.POST:
                relevance_form = RelevanceCodingRecordForm(request.POST, prefix='relevance')
                if relevance_form.is_valid():
                    obj = relevance_form.save(commit=False)
                    obj.article = paginator.page(page).object_list[0]
                    obj.screened = True
                    obj.coder = request.user.coder
                    obj.save()
                    redirect_to = "?page=%s" % page
                    #return HttpResponseRedirect(redirect_to)
                    return HttpResponseRedirect(reverse ('coding:assignment', args=(pk,)))
                event_form = EventRecordForm(prefix='event')
        else:
            event_form = EventRecordForm(prefix='event')
            relevance_form = RelevanceCodingRecordForm(prefix='relevance')

    else:
        print ERROR
    return render(request, 'coding/assignment.html', 
    {'articles':articles,'assignment':assignment,'event_form':event_form,'relevance_form':relevance_form})

And my Template:

<div id="coding">

<div id="relevance">

{% if assignment.screening == True %}

<form action="" method="post" accept-charset="utf-8" id="form">
    {% csrf_token %}
    {{ relevance_form.as_p }}
<p><input type="submit" name="relevance" value="Save &rarr;"></p>
</form>

{% endif %}
</div>

<div id="classifying">
{% if assignment.classifying == True %}

<form action="" method="post" accept-charset="utf-8" id="form">
    {% csrf_token %}
    {{ event_form.as_p}}
<p><input type="submit" name="event" value="Save &rarr;"></p>
</form>

{% endif %}
</div>
<div id="pagination">
    <span class="step-links">
        {% if articles.has_previous %}
        <a href="?page={{ articles.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Article {{ articles.number }} of {{ articles.paginator.num_pages }}.
        </span>
        {% if articles.has_next %}
        <a href="?page={{ articles.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>

I also tried to display the form fields of event_form in two columns by calling them one for one as suggested here, but that did not work either.
I'm really stumped here, I'm sure it's just a minor thing I'm missing, but after staring at this code for days on end, I don't see anything anymore. Any help is greatly appreciated!

Upvotes: 0

Views: 103

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599450

You probably have a validation error, but you'll never see it, because you reinstantiate relevance_form, without passing the POST data, if the form is not valid. Don't do that, just let the form you already have fall through to the render call.

Upvotes: 2

Related Questions