Подтвердите ModelForm без проверки дубликата - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь написать представление в django, которое проверяет, существует ли клиент, тогда ничего не делает. Если его не существует, я создаю.

Вот так выглядит ModelForm:

class FacebookLoginForm(ModelForm):
    class Meta:
        model = Client
        fields = ['facebook_id', 'first_name', 'last_name', 'email']

А вот мой код:

def facebook_login(request):
    data = json.loads(request.body)
    form = FacebookLoginForm(data)

    if form.is_valid():
       # do something
       pass

Однако дляпочему-то, когда я вызываю is_valid в форме, он проверяет, что переданные данные не существуют в базе данных (где поля модели уникальны). Как я могу установить ModelForm для проверки данных без проверки, если они уже существуют? Моя конечная цель - проверить правильность ввода формы, а затем обновить / создать базу данных.

1 Ответ

0 голосов
/ 06 ноября 2019

Если вы хотите придерживаться ModelForm, вы можете переопределить метод validate_unique, который выглядит следующим образом:

def validate_unique(self):
    """
    Calls the instance's validate_unique() method and updates the form's
    validation errors if any were raised.
    """
    exclude = self._get_validation_exclusions()
    try:
        self.instance.validate_unique(exclude=exclude)
    except ValidationError as e:
        self._update_errors(e)

Однако вам, вероятно, лучше просто создать обычную форму, потому чтоэто будет служить вашей цели просто отлично. Переопределение функции validate_unique в этом случае не будет кодом очистки IMO.

EDIT : лучшим решением будет переопределение метода очистки без вызова super. Из исходного кода в методе BaseModelForm __init__:

    # self._validate_unique will be set to True by BaseModelForm.clean().
    # It is False by default so overriding self.clean() and failing to call
    # super will stop validate_unique from being called.

Так вот как должна выглядеть ваша форма:

class FacebookLoginForm(ModelForm):
    class Meta:
        model = Client
        fields = ['facebook_id', 'first_name', 'last_name', 'email']

    def clean(self):
        return self.cleaned_data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...