Login

Modify fields created by form_for_model

Author:
grahamu
Posted:
February 28, 2007
Language:
Python
Version:
Pre .96
Tags:
newforms foreignkey dropdown choicefield form_for_model form_for_instance
Score:
3 (after 3 ratings)

Using newforms you can create forms from existing models easily and automatically with either form_for_model(class) or form_for_instance(instance). Usually the automagically generated form fields are sufficient; however, sometimes you need to restrict selections in a choice field.

You can also set the default selection when instantiating the form. In this example, if acct is not contained in the 'account' field choices, the selection defaults to the first entry.

This example is probably not good practice when using form_for_instance because the existing value 'selection' of the choice field is lost and must be reset manually (see above).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from django.db import models
from django import newforms as forms
from django.contrib.auth.models import User

################ models ####################

class Account(models.Model):
    title = models.CharField(maxlength=30, blank=False)
    users = models.ManyToManyField(User, blank=True, null=True)
    is_active = models.BooleanField()

class Project(models.Model):
    title = models.CharField(maxlength=50, blank=False)
    account = models.ForeignKey(Account, blank=False)

################ views ####################

def add_project(request, acct=None):
    # get new Project form class
    FormClass = forms.models.form_for_model(Project)

    FormClass.base_fields['account'] = \
        forms.ModelChoiceField(queryset=Account.objects.filter(is_active=True))

    # set initial selection in the choice field
    form = FormClass(initial={'account': acct})

More like this

  1. Selectively change fields, widgets or labels in forms created from models by danjak 8 years ago
  2. ingore_fields by RealNitro 7 years, 4 months ago
  3. Convert an instance to a dictionary for use in newforms by SmileyChris 7 years, 10 months ago
  4. newforms field callback helper by SmileyChris 7 years, 10 months ago
  5. Add validation for 'unique' and 'unique_together' constraints to newforms created dynamically via form_for_model or form_for_instance by bikeshedder 7 years, 9 months ago

Comments

mikeivanov (on April 16, 2007):

micampe, it's not better because filter parameters can be part of the user input.

#

pcollins (on August 30, 2007):

The code

FormClass.base_fields['account'] = forms.ModelChoiceField(queryset=Account.objects.filter(is_active=True))

has the side affect of losing any labeling magic that the model is doing for you (e.g. internationalization of the label). An alternative is to do

    FormClass.base_fields['account'].choices = [(a.id, str(a)) for a in Account.objects.filter(is_active=True)]

#

Please login first before commenting.