Modify fields created by form_for_model

 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 7 years, 1 month ago
  2. ingore_fields by RealNitro 6 years, 5 months ago
  3. Convert an instance to a dictionary for use in newforms by SmileyChris 6 years, 12 months ago
  4. newforms field callback helper by SmileyChris 6 years, 11 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 6 years, 10 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)]

#

(Forgotten your password?)