Сужение выбора в форме Джанго - PullRequest
3 голосов
/ 10 сентября 2009

У меня есть модель как:

CAMPAIGN_TYPES = (
                  ('email','Email'),
                  ('display','Display'),
                  ('search','Search'),
                  )

class Campaign(models.Model):
    name = models.CharField(max_length=255)
    type = models.CharField(max_length=30,choices=CAMPAIGN_TYPES,default='display')

И форма:

class CampaignForm(ModelForm):
    class Meta:
        model = Campaign

Есть ли способ ограничить варианты выбора для поля типа? Я знаю, для одного поля значения я могу сделать: CampaignForm(initial={'name':'Default Name'}), но я не могу найти способ сделать это для набора выбора.

Ответы [ 3 ]

6 голосов
/ 13 сентября 2009

Вот как я ограничил отображаемые параметры:

В forms.py добавьте метод init для вашей формы

class TaskForm(forms.ModelForm):
    ....

    def __init__(self, user, *args, **kwargs):
        '''
        limit the choice of owner to the currently logged in users hats
        '''

        super(TaskForm, self).__init__(*args, **kwargs)

        # get different list of choices here
        choices = Who.objects.filter(owner=user).values_list('id','name')
        self.fields["owner"].choices = choices
1 голос
/ 11 сентября 2009

Кажется, что это лучший способ сделать это, переопределив поле 'type':

class CampaignForm(ModelForm):
    type = forms.ModelChoiceField(queryset=OtherModel.objects.filter(type__id=1))
    class Meta:
        model = Campaign

Сейчас я не уверен, как передать «1», но этого будет достаточно, даже если его нужно жестко закодировать. Кроме того, это позволяет Django выполнять большую часть тяжелой работы.

@ soviut Я изменю имя поля на незарезервированное слово. Спасибо за внимание.

1 голос
/ 10 сентября 2009

Выбор только для списков, а не CharFields. Что вам нужно сделать, это создать пользовательский валидатор на clean().

в форм.пи

CAMPAIGN_TYPES = ('email', 'display', 'search')

# this would be derived from your Campaign modelform
class EnhancedCampaignForm(CampaignForm):
    # override clean_FIELD
    def clean_type(self):
        cleaned_data = self.cleaned_data
        campaign_type = cleaned_data.get("type")

        # strip whitespace and lowercase the field string for better matching
        campaign_type = campaign_type.strip().lower()

        # ensure the field string matches a CAMPAIGN_TYPE, otherwise 
        # raise an exception so validation fails
        if not campaign_type in CAMPAIGN_TYPE:
            raise forms.ValidationError("Not a valid campaign type.")

        # if everything worked, return the field's original value
        return cleaned_data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...