【问题标题】:Not able to get initial data for django form无法获取 django 表单的初始数据
【发布时间】:2016-05-16 10:51:57
【问题描述】:

这里是 django 表单,这是 django 用户更改表单

class UserChangeForm(forms.ModelForm):
    """A form for updating users. Includes all the fields on
    the user, but replaces the password field with admin's
    password hash display field.
    """

    class Meta:
        model = MyUser
        fields = ('first_name', 'last_name', 'mobile' , 'gender')
        widgets = {
        'gender': forms.RadioSelect(),
        }

    def __init__(self, *args, **kwargs):
        super(UserChangeForm, self).__init__(*args, **kwargs)
        if self.request.user.is_authenticated():
            user = User.objects.get(email=self.request.user.email)
            first_name = user.first_name
            last_name = user.last_name
            mobile = user.mobile
            gender = user.gender

        self.fields['first_name'].initial = first_name
        self.fields['last_name'].initial = last_name
        self.fields['mobile'].initial = mobile
        self.fields['gender'].initial = gender

这是我遇到的错误

'UserChangeForm' object has no attribute 'request'

这里是风景

class UserProfileEditView(DetailView):
    template_name = "edit_profile.html"

    def get(self , request , *args , **kwargs):
        context = {}
        edit_form = UserChangeForm()

        context['edit_form'] =  edit_form

        return render(request , self.template_name , context)

这是回溯

File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django\views\generic\base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\views\generic\base.py" in dispatch
  89.         return handler(request, *args, **kwargs)
File "C:\Users\lenovo\Desktop\Grooved2\grooved\src\accounts\views.py" in get
  54.         edit_form = UserChangeForm()
File "C:\Users\lenovo\Desktop\Grooved2\grooved\src\accounts\forms.py" in __init__
  58.         if self.request.user.is_authenticated():

如何获取 django 表单中字段的初始数据? 谢谢

编辑MHassan回复后

这是表格

def __init__(self, *args, **kwargs):
        super(UserChangeForm, self).__init__(*args, **kwargs)
        intial_data = self.kwargs.get('initial')
        request = intial_data.get('request')

        if self.request.user.is_authenticated():
            user = User.objects.get(email=request.user.email)
            first_name = user.first_name
            last_name = user.last_name
            mobile = user.mobile
            gender = user.gender

        self.fields['first_name'].initial = first_name
        self.fields['last_name'].initial = last_name
        self.fields['mobile'].initial = mobile
        self.fields['gender'].initial = gender
        del self.fields['gender'].widget.choices[0]

这里是风景

def get(self , request , *args , **kwargs):
        context = {}
        edit_form = UserChangeForm(initial={'request': request})

        context['edit_form'] =  edit_form

        return render(request , self.template_name , context)

这是回溯

File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django\views\generic\base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\views\generic\base.py" in dispatch
  89.         return handler(request, *args, **kwargs)
File "C:\Users\lenovo\Desktop\Grooved2\grooved\src\accounts\views.py" in get
  54.         edit_form = UserChangeForm(initial={'request': request})
File "C:\Users\lenovo\Desktop\Grooved2\grooved\src\accounts\forms.py" in __init__
  58.         intial_data = self.kwargs.get('initial')

【问题讨论】:

  • 为您的视图显示代码。
  • 视图添加到问题@MHassan
  • 我已经发布了答案。您将使用get_initial 函数将初始数据发送到您的表单。

标签: python django python-2.7 django-forms


【解决方案1】:

Form 类中默认没有 Django 请求对象,所以你必须自己传递:

class UserChangeForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        # Call super() after deleting the extra kwargs.
        super(UserChangeForm, self).__init__(*args, **kwargs)
        # Other code

并在您在视图中创建表单时传递它:

def update(request):
    form = UserChangeForm(request=request)

【讨论】:

  • __init__() 得到了一个意外的关键字参数“请求”
  • 如果您收到该错误,则说明您没有正确复制 Gianluca 的代码。
  • 非常感谢@Gianluca
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
相关资源
最近更新 更多