django - 将 **kwargs 传递给 Django Form

标签 django django-forms

我正在尝试构建自定义 Django 表单来更改应用程序的用户名和用户电子邮件。这就是为什么我需要将用户详细信息从 session 传递到表单以检查登录用户是否存在的原因。我是这样做的:

在 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 并且它给了我同样的错误

最佳答案

user_details 被传递给 __init__,因此未在其外部定义。这就是为什么在实例化 CharField 对象时无法访问它的原因。在 __init__ 本身中设置 initial,例如,在你从 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 .

关于django - 将 **kwargs 传递给 Django Form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1993014/

相关文章:

python - Django:限制模型数据

Ubuntu 18.04 上的 Django 站点在安装 SSL 后无法使用 Apache2

python - 将单选按钮与 Django 中的表行关联

Django 休息框架 : How to change error response format globally

python - 未实现错误 : Django doesn't provide a DB representation for AnonymousUser

python - Django orm - 如何在不同日期的查询中获取不同的字段项

django:断言错误 `create()`没有返回对象实例

javascript - Django Admin 根据其他选择动态禁用字段

django - 使用 get_form_kwargs 时 __init__() 收到意外的关键字参数

django - 预填充 MultipleChoiceField django