Настроить отображение поля inline_formset внешнего ключа - PullRequest
2 голосов
/ 06 марта 2011

У меня есть модель Access, которая связана с двумя другими моделями.

class Access (models.Model):
    portfolio_id = models.ForeignKey(Portfolio)
    user_id = models.ForeignKey(User)
    title = models.CharField(max_length=30, null=True, blank=True)
    access_rights = models.PositiveIntegerField(choices=ACCESS_CHOICES)

Я создал эту форму.

class UserAccessForm(forms.ModelForm):
    class Meta:
    model = Access

У меня есть это в представлении.

AccessFormSet = inlineformset_factory(Portfolio,
                                      Access,
                                      form=UserAccessForm,
                                      extra=1,
                                      can_delete=False)
cAccessFormSet = AccessFormSet(instance=cPorfolio)

Проблема находится на веб-странице, user_id отображается как поле выбора, дающее мне список всех моих пользователей (т.е. "jane15", "tom54"). Я хочу, чтобы это было текстовое поле, которое кто-то должен ввести в имени пользователя. Когда я пытаюсь настроить его, как показано ниже, он отображает «идентификаторы пользователя» вместо «имя пользователя» (т.е. «1», «2»).

class UserAccessForm(forms.ModelForm):
    user_id = forms.ChoiceField(required=True, widget=forms.TextInput)
    class Meta:
        model = Access

Как заставить набор форм отображать и принимать имена пользователей (т.е. "jane15") как текстовое поле, а не как поле выбора?

1 Ответ

1 голос
/ 06 марта 2011

Хорошо, если вы хотите ввести имя пользователя, поле выбора не подходит.

Используйте CharField, который является <input type='text'>, и переопределите метод clean_FOO, чтобы подтвердить ввод в пользовательский экземпляр или вызвать сообщение об ошибке.

class UserAccessForm(forms.ModelForm):
    user_id = forms.CharField()

    class Meta:
        model = Access

    def clean_user_id(self):
        data = self.cleaned_data.get('user_id')
        try:
            user = User.objects.get(username=data)
        except User.DoesNotExist:
            raise forms.ValidationError("No user exists by that username")
        return user

Передайте это в форму, и все готово.

...