Скрытое поле в форме Django отсутствует в cleaned_data - PullRequest
9 голосов
/ 30 ноября 2011

У меня есть эта форма:

class CollaboratorForm(forms.Form):
    user = forms.CharField(label="Username",max_length=100)
    canvas = forms.IntegerField(widget=forms.HiddenInput)
    ....
    def clean_user(self):
        user = self.cleaned_data['user']
        canvas = self.cleaned_data['canvas']

По мнению, я просто звоню

if form.is_valid():

Я получаю ошибку:

KeyError at /canvas/1/add-collaborator/
'canvas'

По словам firebug, значение публикуется, просто оно не подходит для моей чистой функции. Я делаю это неправильно?

РЕДАКТИРОВАТЬ: Опубликовать данные

canvas  1
csrfmiddlewaretoken 2cb73be791b32ca9a41566082c804312
user    username

РЕДАКТИРОВАТЬ 2: Я также хотел бы принять ответ, который может сказать мне, как отправить первичный ключ в функцию clean_user, где первичный ключ является / 1 / в приведенном выше URL-адресе. Вызываемая функция в представлении:

def canvas_add_collaborator(request, pk):

Так что я бы хотел отправить pk в функцию clean_user, которая решит мою проблему, не требуя скрытого поля.

Ответы [ 3 ]

10 голосов
/ 30 ноября 2011

Вам нужно изменить имя метода на clean (), а не clean_user (). «canvas» отсутствует в cleaned_data, если вы просто проверяете поле пользователя.

0 голосов
/ 09 апреля 2017

Я обнаружил, что порядок в объявлении полей имеет значение, поэтому, если вы хотите получить доступ к cleaned_data ['canvas'] в методе clean_user, вы должны сначала объявить canvas в ваших полях. Я проверил это в модельных формах

0 голосов
/ 30 ноября 2011

Я решил свою проблему (вероятно, не лучшим образом, но работает), используя это:

class CollaboratorForm(forms.Form):
    ....
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('canvas', None)
        super(CollaboratorForm, self).__init__(*args, **kwargs)

Тогда, на мой взгляд:

def canvas_add_collaborator(request, pk):
    ....
    form.canvas = pk

Возможно, не самое элегантное решениено пока работаетОбратная связь приветствуется.

...