Подтвердить что ты не робот

Передача ** kwargs в форму Django

Я пытаюсь создать пользовательскую форму django для изменения имени пользователя и электронной почты пользователя для приложения. Поэтому мне нужно передать данные пользователя из сеанса в форму, чтобы проверить, существует ли зарегистрированный пользователь. Я делаю так:

в views.py

personal_info_form = PersonalInfoForm(prefix='personal_info',
                                      user_details=user_details)

где user_details - словарь:

'user_details': [{'username': u'username', 
                  'registration_date': datetime.date(2009, 10, 22), 
                  'id': 13, 'email': u'[email protected]'}]}

В forms.py у меня есть следующий код:

class PersonalInfoForm(forms.Form):

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

    username = forms.CharField(required=True, initial=user_details[0]['username'])
    email = forms.EmailField(required=True)

И я получаю следующую ошибку:

name 'user_details' is not defined

Я попытался обратиться к нему с помощью self.user_details и только user_details, и он дал мне ту же ошибку

4b9b3361

Ответ 1

user_details передается __init__, поэтому не определяется вне его. Вот почему вы не можете получить к нему доступ, когда вы ставите объект CharField. Установите initial в __init__ самостоятельно, после того как вы вытащили его из kwargs, например:

class PersonalInfoForm(forms.Form):

    username = forms.CharField(required=True)
    email = forms.EmailField(required=True)

    def __init__(self, *args, **kwargs):
        user_details = kwargs.pop('user_details', None)
        super(PersonalInfoForm, self).__init__(*args, **kwargs)
        if user_details:
            self.fields['username'].initial = user_details[0]['username']

Когда вы получите шанс, рассмотрите возможность чтения областей в python.

Ответ 2

Можете ли вы объяснить более четко, что вы пытаетесь сделать? Я считаю, что то, что вы делаете, не нужно. Не уверен, что я понял вас, но взгляните на Django Model Forms: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

>>> from django.forms import ModelForm

# Create the form class.
>>> class ArticleForm(ModelForm):
...     class Meta:
...         model = Article

# Creating a form to add an article.
>>> form = ArticleForm()

# Creating a form to change an existing article.
>>> article = Article.objects.get(pk=1)
>>> form = ArticleForm(instance=article)

Если это то, что вы ищете, вы можете легко добавить команду для использования своей модели пользователя. Помните, что вы можете выбрать, какие поля вы хотите изменить. Параметр instance устанавливает начальные значения полей (это то, что я понял, вы хотите сделать). В приведенном выше примере будут показаны все поля, в приведенном ниже примере показано, как отображать только 2 поля.

class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title')

Надеюсь, я помог.