django prepopulate modelform - 没有任何反应

时间:2013-04-06 15:48:28

标签: django django-forms instance

这一定是一件非常简单的事情,但我似乎无法通过它......

我尝试构建一个用户可以更新ModelForm的表单。首先,他插入一个用户ID,之后我想向他展示预先填充原始数据的表格,这样他就可以只更改他想要的字段。

在我的朋友谷歌,stackoverflow和django文档的一些帮助之后,我来到这里:

views.py

 user = User.objects.get(user_id=usr)  
 if request.method == 'POST':  
      form = TableForm(request.POST)  
      if form.is_valid():  
           #do something  
 else:  
      form = TableForm(instance=user)  
      return render_to_response('template.html',{'form':form})  

forms.py

class TableForm(forms.ModelForm):
     pres_clinic = forms.ModelChoiceField(queryset=PresClinic.objects.all(),
        widget=SelectWithPop(), label=ugettext("Clinic presentation"),
        required=False)

     MAYBECHOICES = (
         ('', '---------'),
         (ugettext('Yes'), ugettext('Yes')),
         (ugettext('No'), ugettext('No')))

     bcg_scar = forms.ChoiceField(choices=MAYBECHOICES, label=ugettext(
            "BCG scar"), required=False)
     mantoux_register = forms.ChoiceField(choices=MAYBECHOICES,
        label=ugettext("Mantoux register"), required=False)
     date_diag = forms.DateField(widget=DateTimeWidget, label=ugettext(
         "Diagnosis date"), required=False)
     situation = forms.ModelChoiceField(queryset=Situation.objects.all(),
        widget=SelectWithPop(), label=ugettext("Patient status"),
        required=False)
     date_situation = forms.DateField(widget=DateTimeWidget, label=ugettext(
        "Date patient status"), required=False)

  class Meta:
    model = Table
    fields = ('pres_clinic', 'bcg_scar', 'mantoux_register',
            'date_diag', 'situation', 'date_situation')

def clean(self):
    cleaned_data = self.cleaned_data
    diag = cleaned_data.get('date_diag')

    errors = []

    now = datetime.date.today()

    if diag is not None and diag != u'':
        if diag > now:
            errors.append(ugettext('The field "Diagnosis date" should be '
                'smaller than the actual date'))
    if errors:
        raise ValidationError(errors)

    return cleaned_data

模板:

 {{ form }} # presents the empty form and not the data from that user  

django的版本是1.4

任何人都可以告诉我出了什么问题以及为什么我无法看到填写的表单?

非常感谢

2 个答案:

答案 0 :(得分:7)

您需要定义一个用于初始数据的字典,并从TableForm(instance = user)更改为TableForm(initial = dict),例如:

 user = User.objects.get(user_id=usr)  
 if request.method == 'POST':  
     form = TableForm(request.POST)  
     if form.is_valid():  
         #do something  
 else:  
      data = {'pres_clinic' : 'value', 'bcg_scar' : 'value', 'mantoux_register' : 'value'}
      form = TableForm(initial=data)  
 return render_to_response('template.html',{'form':form})  

我还会将渲染器放到if语句的响应中,所以如果表单无效,页面应该重新加载并显示任何错误。

有关django docs here

的更多信息

我希望这有帮助!

答案 1 :(得分:4)

您可以尝试' model_to_dict'

from django.forms.models import model_to_dict

 user = User.objects.get(user_id=usr)  
 if request.method == 'POST':  
     form = TableForm(request.POST)  
     if form.is_valid():  
         #do something  
 else:          
     form = TableForm(initial=model_to_dict(user))  
 return render_to_response('template.html',{'form':form})