简体   繁体   中英

Why the django form data cannot display after submitting

After submitting the form (input), it will redirect to another page(result) and show the form information in this result page.

The problem now is that the submitted information doesn't show in the result page.

I doubt the reason is because in result' views.py, I want to show the submitted form from Input,but the form's data is not saved or I shouldn't fetch the data from the model,I should fetch the data from view,so it cannot display the table:

context['input'] = Input.objects.all()

Please correct me if my guess is right or not. Thanks in advance for your suggestion.

input- models.py

class Input(models.Model):

    company=models.CharField(max_length=100,default='Empty')
    region=models.CharField(max_length=100,default='Empty')
    start_date=models.DateField(auto_now=False, auto_now_add=False,default='Empty')
    end_date=models.DateField(auto_now=False, auto_now_add=False,default='Empty')

input -- form

class Inputform(forms.ModelForm):
    company=forms.CharField()
    regionlist = forms.ModelChoiceField(queryset=Result.objects.values('region').distinct())
    start_date=forms.DateField(widget=DateInput(),required=True)
    end_date = forms.DateField(widget=DateInput(),required=True)

    class Meta:
        model = Input
        fields = ('company', 'region','start_date','end_date')
        widgets = {
            'start_date': forms.DateInput(attrs={'class':'datepicker'}),
            'end_date': forms.DateInput(attrs={'class':'datepicker'}),
        }

input -- part of the html code

<form action="result_list/" method="post">{% csrf_token %}

        <!--enter company--> 
        <div class="field">
            <p>Company:<input type="text" name="Company" value="{{company}}"/>
        </div>


        <!--select region-->
        <div class="field" >
            <label> Select the Region:
            {{ form.regionlist }}
                {% for region in form.regionlist.choices %}
                     <option value="{{ val }}" {% ifequal data.val val %}selected {% endifequal %}></option>
                {% endfor %}
            </label>
        </div>
  ....
  <div class="fieldWrapper">
        <p><input type="submit" value="Submit" /></p></div>
 </form>

input --views

from django.http import HttpResponseRedirect
from django.shortcuts import render,render_to_response,get_object_or_404
from inputform.forms import Inputform
from inputform.models import Input
from result.models import Result
from django.views.decorators.csrf import csrf_exempt
from django.views.generic.list import ListView

@csrf_exempt

def input(request):
    if request.method == 'POST':
        form = Inputform(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            print (cd['company'])
            form.save()
            return redirect('result')

urls

from inputform import views
from django.views.generic.list import ListView
from inputform.views import input
from django.views.generic import RedirectView
  urlpatterns = patterns('',
    url(r'^result_list/$',ResultView.as_view(),name='result'),
    (r'^input/$', RedirectView.as_view(url='/result_list/')),
      }

Result --views.py

class ResultView(ListView):
    context_object_name = 'result_list'
    template_name = 'result_list.html'
    queryset = Result.objects.all()

def get_context_data(self, **kwargs):
        context = super(ResultView, self).get_context_data(**kwargs)
        context['input'] = Input.objects.all()
        return context

Result -- html

{% for input_object in input %}
        <table border="1" cellpadding="1">
        <tr>
            <td align="left">Company</td>
            <td>{{input_object.company}}</td>
        </tr>

        <tr>
            <td align="left">Region</td>
            <td>{{input_object.region}}</td>
        </tr>
          ...
        </table>
{% endfor %}

Your code looks rather messy. Its not clear, how you initially pass the empty form to input template.

However, the problem may arise cause you do not pass the whole form to your template, but only {{ form.regionlist }} . So your inputs cannot write any data to db.

Render either the whole {{ form }} or each field one by one as you've done for regionlist field.

Moreover, you do not need to dublicate model field in forms.py if it does not actually override somehow the original field in models.py .

The root cause is actually in url.py:

Should delete "(r'^input/$', RedirectView.as_view(url='/result_list/')),",only to put redirect in views.py is enough.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM