【问题标题】:Passing **kwargs to Django Form将 **kwargs 传递给 Django 表单
【发布时间】:2010-12-31 20:52:59
【问题描述】:

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

【问题讨论】:

    标签: django django-forms


    【解决方案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']
    

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

    【讨论】:

    • +1 漂亮。在提交我非常相似的解决方案前 10 秒,橙色横幅弹出......做得很好!
    【解决方案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')
    

    希望我有所帮助。

    【讨论】:

    • 我正在尝试从 Forms 类中的 **kwargs 访问变量。
    • 是的。它给我的名字'kwargs'没有定义
    猜你喜欢
    • 2015-11-27
    • 2016-12-11
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    相关资源
    最近更新 更多