Как проверить поле определенной формы с игнорированием обязательных полей? - PullRequest
2 голосов
/ 02 марта 2011

Я хочу проверить только одно поле формы.Вот моя модель:

class Person(models.Model): 
     user = models.ForeignKey(User)
     avatar = models.ImageField(upload_to=get_upload_path)
     creation_time = models.DateTimeField(auto_now=True)

На мой взгляд, я хочу разрешить пользователям обновлять свои аватары.Поэтому, когда пользователь нажимает кнопку «Обновить», я просто хочу отправить файл аватара и проверить его только.

Мое представление update_avatar находится здесь:

@csrf_exempt
def update_avatar(request,user_id):
    profile_owner = Person.objects.get(user__id = user_id)
    form = ProfileSettings()
    if request.method == 'POST':
        form = ProfileSettings(request.POST,request.FILES)
        if form.is_valid():                                                                                                                                                                                                    
           return HttpResponse("ok")
    return HttpResponse("else")
#the code is not complete, this is for only testing purpose =) 

Когда я вызываю form.is_valid (), Я думаю, что это выглядит и другая информация, которая требуется.Так у вас есть идея, как я могу проверить только часть аватара?

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Чтобы расширить ответ от радости, вы можете использовать ModelForm s, чтобы вам не нужно было объявлять поле напрямую:

from django import forms


class AvatarForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = (
            'avatar',
        )

Я нашел это решение немного чище вбольшинство случаев ...

2 голосов
/ 02 марта 2011

Вы можете выбрать один из двух вариантов:

  1. написать пользовательскую форму, скажем, AvatarForm и использовать ее вместо этого при обновлении аватара, или вы можете
  2. написать пользовательскую функцию, которая проверяет поле аватара, и вызывать ее вместо form.is_valid ()

Я говорю, пойдите во-первых, так намного проще, и проверка уже выполняется для вас, когда вы вызываете метод is_valid (). Вот как может выглядеть ваша форма:

class AvatarForm(forms.Form):
    avatar = forms.ImageField()
0 голосов
/ 26 июля 2014

Проверьте django.forms.forms.BaseForm._clean_fields, чтобы увидеть, как Django проверяет каждое поле при вызове is_valid().

Если вы хотите проверить одно поле в форме, привяжите данные как обычно, а затем (в основном) просто вызовите метод clean() этого поля.

Обратите внимание, что вам придется продублировать часть кода установки в _clean_fields():

@csrf_exempt
def update_avatar(request,user_id):
    profile_owner = Person.objects.get(user__id = user_id)

    if request.method == 'POST':
        form = ProfileSettings(request.POST, request.FILES)

        # Validate avatar.
        field   = form.fields['avatar']

        initial = form.initial.get('avatar', field.initial)
        upload  = field.widget.value_from_datadict(form.data, form.files, form.add_prefix('avatar'))

        try:
            avatar = field.clean(upload, initial)

            # Avatar is valid.
            return HttpResponse("ok")

        except ValidationError as e:
            # Avatar is invalid.
            return HttpResponse(e.message)
    else:
        form = ProfileSettings()

    return HttpResponse("else")

Есть две ошибки, за которыми вы должны следить:

  • Если в вашей форме также определен метод clean_avatar(), вам нужно явно вызвать его.
  • Вы должны быть осторожны с любым соответствующим кодом, который также выполняется в методе _post_clean() формы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...