Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django prepopulate modelform - nothing happens

This must be a very simple thing however I can not seem to get through it..

I trying to build a form where the user can update a ModelForm. First he inserts a user id and afterwards I want to show him the form pre-populate with the original data so he can change only the fields that he wants.

After some the help of my friend google, stackoverflow and the django documentation, I've come to this:

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

template:

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

The version of django is 1.4

Can anyone tell me what is wrong and why I'm not able to see the form populated?

Thank you very much

like image 421
psoares Avatar asked Apr 06 '13 15:04

psoares


2 Answers

You need to define a dictionary to be used for the initial data and change from TableForm(instance=user) to TableForm(initial=dict), for example something like:

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

I would also put the render to response out of the if statement so if the form isn't valid the page should reload and show any errors.

More information on the django docs here

I hope this helps!

like image 138
Jeff_Hd Avatar answered Nov 09 '22 00:11

Jeff_Hd


You can try '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})
like image 41
Ray Jowa Avatar answered Nov 09 '22 00:11

Ray Jowa