получить данные запроса в форме Django - PullRequest
46 голосов
/ 30 июля 2009

Можно ли получить данные request.user в классе формы? Я хочу очистить адрес электронной почты, чтобы убедиться, что он уникален, но если это адрес электронной почты текущего пользователя, он должен пройти.

Это то, что у меня в данный момент отлично работает для создания новых пользователей, но если я хочу отредактировать пользователя, я сталкиваюсь с проблемой, что его электронная почта не проверяется, потому что она уже получена. Если бы я мог проверить, что это их электронная почта, используя request.user.email, я бы смог решить мою проблему, но я не уверен, как это сделать.

class editUserForm(forms.Form):
    email_address = forms.EmailField(widget=forms.TextInput(attrs={'class':'required'}))

    def clean_email_address(self):
        this_email = self.cleaned_data['email_address']
        test = UserProfiles.objects.filter(email = this_email)
        if len(test)>0:
            raise ValidationError("A user with that email already exists.")
        else:
            return this_email

Ответы [ 4 ]

63 голосов
/ 30 июля 2009

Как указали ars и Diarmuid, вы можете указать request.user в своей форме и использовать ее при проверке электронной почты. Код Диармуида, однако, неверен. Код должен действительно читать:

from django import forms

class UserForm(forms.Form):
    email_address = forms.EmailField(widget = forms.TextInput(attrs = {'class':'required'}))

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

    def clean_email_address(self):
        email = self.cleaned_data.get('email_address')
        if self.user and self.user.email == email:
            return email
        if UserProfile.objects.filter(email=email).count():
            raise forms.ValidationError(u'That email address already exists.')
        return email

Тогда, на ваш взгляд, вы можете использовать его так:

def someview(request):
    if request.method == 'POST':
        form = UserForm(request.POST, user=request.user)
        if form.is_valid():
            # Do something with the data
            pass
    else:
        form = UserForm(user=request.user)
    # Rest of your view follows

Обратите внимание, что вы должны передать request.POST в качестве аргумента ключевого слова, так как ваш конструктор ожидает 'user' в качестве первого позиционного аргумента.

Делая это таким образом, вы должны передать user в качестве аргумента ключевого слова. Вы можете передать request.POST в качестве позиционного аргумента или аргумента ключевого слова (через data=request.POST).

29 голосов
/ 02 февраля 2013

Вот способ получить пользователя в вашей форме при использовании общих представлений:

В представлении передайте request.user в форму, используя get_form_kwargs:

class SampleView(View):
    def get_form_kwargs(self):
        kwargs = super(SampleView, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

В форме вы получите user с функцией __init__:

class SampleForm(Form):
    def __init__(self, user, *args, **kwargs):
        super(SampleForm, self).__init__(*args, **kwargs)
        self.user = user
4 голосов
/ 07 января 2013

Точно так же, как вы знаете, с Django 1.4 и базовыми классами CreateView и UpdateView, self.instance заполняется в каждой форме модели, что позволяет сравнивать POST-сообщение с текущим пользователем.

Вот пример кода с использованием mixin

class EmailUniqueMixin(object):
    """
    Ensure each User's email is unique
    on the form level
    """
    def clean_email(self):
        email = self.cleaned_data['email']
        existing_email = User.objects.filter(email=email).exclude(pk=self.instance.id)
        if existing_email:
            raise forms.ValidationError('That email address already exists')
        else:
            return email
0 голосов
/ 30 июля 2009

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

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