Передача аргумента чистому методу Django ModelForm - PullRequest
3 голосов
/ 31 августа 2011

Я пытаюсь передать аргумент методу clean моей ModelForm, чтобы я мог выполнить дополнительную проверку некоторых данных.

В моем файле views.py у меня есть:

page_data = page_form.cleaned_data(foo="bar")

В моем методе clean_url у меня есть:

def clean_url(self, **kwargs):
    url = self.cleaned_data['url']

    if kwargs['foo'] == url:
        query = FlatPage.objects.filter(url=url)
        if query.exists():
            raise forms.ValidationError(("This url is already being used by the '%s' page.") % (query[0].title))

    return url

Я продолжаю получать KeyError для foo.Я не уверен, где я делаю ошибку здесь, так как я передал переменные kwarg раньше, но никогда не передавал чистый метод.

Ответы [ 2 ]

9 голосов
/ 11 сентября 2011

Ключ заключается в передаче параметров через метод init ModelForm:

def __init__(self, *args, **kwargs):
    self.url = kwargs.pop('url', None)
    super(FlatPageForm, self).__init__(*args, **kwargs)

На эту переменную можно ссылаться в методе clean, вызывая self.url

def clean_url(self):
    url = self.cleaned_data['url']
    if self.url == url:
         #do something
    else:
         #do something else
0 голосов
/ 01 августа 2016

При использовании представлений на основе классов вы можете использовать get_form_kwargs для передачи переменной из представления в вашу форму, а затем в метод очистки:

По вашему мнению:

def get_form_kwargs(self):
    kwargs = super(MyCreateView, self).get_form_kwargs()
    kwargs.update({'url': self.kwargs['url']})  # or wherever the url parameter is coming from
    return kwargs

В вашей форме:

def __init__(self, *args, **kwargs):
    self.url = kwargs.pop('url', None)
    super(FlatPageForm, self).__init__(*args, **kwargs)

А затем ссылка self.url в вашем clean() методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...