django预填充modelform-什么都不发生

django预填充modelform-什么都不发生,django,django-forms,instance,Django,Django Forms,Instance,这一定是件很简单的事,但我似乎无法克服 我正在尝试构建一个表单,用户可以在其中更新ModelForm。首先,他插入一个用户id,然后我想向他展示用原始数据预填充的表单,这样他就可以只更改他想要的字段 在我的朋友google、stackoverflow和django文档的帮助下,我得出以下结论: views.py user = User.objects.get(user_id=usr) if request.method == 'POST': form = TableFor

这一定是件很简单的事,但我似乎无法克服

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

在我的朋友google、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

有人能告诉我哪里出了问题,为什么我看不到填充的表单吗


非常感谢

您需要定义一个用于初始数据的字典,并从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})  
我还将把render to response放在if语句之外,这样如果表单无效,页面应该重新加载并显示任何错误

有关


我希望这有帮助

您可以尝试“从模型到命令”

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

您能在表单代码中快速编辑吗?正如在tableform代码中一样…@Jeff我添加了表单,但是我省略了一些行,因为它更大,但是结构在那里。谢谢,谢谢!我还用字典思考了一下首字母。但是我不明白为什么这个实例不起作用。就我所见,它应该是有效的,而且比为每个字段创建字典要好。。你知道为什么这个实例不起作用吗?在这种情况下,我的猜测是,当您向tableform提供一个用户模型的实例时(需要一个tableform模型),它失败了。不过,这是我最初的假设,可能不正确!:)我猜完全正确!!我已经尝试了tableform的一个实例。非常感谢。我花了几个小时试图弄明白为什么它不起作用。。很简单:p谢谢