将** kwargs传递给Django Form

时间:2010-01-02 21:56:58

标签: django django-forms

我正在尝试构建自定义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访问它并且它给了我同样的错误

2 个答案:

答案 0 :(得分:40)

user_details传递给__init__,所以没有在它之外定义。这就是为什么在设置CharField对象时无法访问它的原因。在你从kwargs弹出它后,在initial中设置__init__,例如:

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

如果有机会,请考虑阅读scopes in python

答案 1 :(得分:3)

你能以更清晰的方式解释你想做什么吗?我相信你所做的事情是不必要的。不确定我是否理解你,但看看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)

如果您正在寻找它,您可以轻松添加以使用您的用户模型。请记住,您可以选择要允许更改的字段。 instance参数设置初始字段值(这是我理解你想要做的)。上面的示例将显示所有字段,下面的示例显示如何仅显示2个字段。

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

希望我帮助过。