Передача ** 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'user@mail.com'}]}

В 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 и это дает мне ту же ошибку

27
задан bnjmn 9 May 2013 в 22:25
поделиться

2 ответа

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']

Когда у вас будет возможность, подумайте о чтении на диапазонах в питоне.

.
44
ответ дан 28 November 2019 в 05:14
поделиться

Можете ли вы объяснить более ясно, что вы пытаетесь сделать? Я считаю, что то, что вы делаете, ненужно. Не уверен, что понял Вас, но взгляните на формы модели Django: 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)

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

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

Hope I've helped.

.
3
ответ дан 28 November 2019 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: