Python中的自定义UpdateView

时间:2017-07-26 00:58:08

标签: django python-3.x django-models django-templates django-views

我正在尝试使用自定义UpdateView在Python / Django中工作。我相信我写的代码大多是正确的,因为当我点击相关的下拉列表时,它似乎在URL中返回正确的主键ID。问题是我在更新模式下没有在屏幕上看到与此记录相关的任何数据。屏幕显示在编辑模式下,但没有数据。我怀疑问题可能是html表单中的django模板?但是,我使用了表单并使用了{{form}},它也返回了一个空白表单。我整个下午都玩过这个,我猜对了。以下是我的观点:

def updating_document(request, pk):
    doc = get_object_or_404(Doc, pk=pk)
    form = Update_Doc_Form(request.user, request.POST)
    if request.method == 'GET':
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('App:main_procedure_menu'))
    else:
        print("Form is invalid!")
    return render(request,'Doc/update_doc.html',{'form':form })

我也有一个相关的表格......

Form.py

   class Update_Doc_Form(forms.ModelForm):       

     class Meta:
        model = Doc 
        exclude = ['user']

        doc_name = forms.CharField(widget=forms.TextInput)
        description = forms.CharField(required=True,widget=forms.Textarea)
        team = forms.CharField(widget=forms.Select)
        document = forms.CharField(required=True,widget=forms.Textarea)

        def __init__(self, *args, **kwargs):
            super(Update_Doc_Form, self).__init__(*args, **kwargs)
            self.fields['doc_name'].widget.attrs['class'] = 'name'
            self.fields['description'].widget.attrs['class'] = 'description'
            self.fields['team'].widget.attrs['class'] = 'choices'
            self.fields['team'].empty_label = ''

我是新手,但我确实想使用自定义UpdateView,以便我可以更改某些字段并传递用户信息。我觉得代码很接近,只需要弄清楚为什么它实际上并没有用数据填充表单。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

一天有什么不同。今天早上在SO上找到答案。不确定如何归功于此人或发行号码....

答案是将以下代码行添加到我的表单中:

    user = kwargs.pop('object_user')

我还需要将以下功能添加到我的视图中:

def get_form_kwargs(self):
    kwargs = super(ViewName,self).get_form_kwargs()
    kwargs.update({'object_user':self.request.user})
    return kwargs

这个问题最初由Ivan ViraByan于2013年回答。谢谢伊万!

我最终选择了一个基于标准类的UpdateView,并在我能够弄清楚如何使用基于类的视图(UpdateView)并在将用户信息传递给表格基于Ivan ViraByan在2013年的回答。

上面的代码允许您获取用户但不将其传递给ModelForm,这样您就不会收到意外的用户错误。