在Django中如何在ModelForm外部设置字段? [英] How do I set fields in ModelForm externally in Django?

查看:334
本文介绍了在Django中如何在ModelForm外部设置字段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前在 views.py 中的设置看起来像这样

  def order_detail(request,pk):
order = Order.objects.get(pk = pk)

#在此定义can_something变量。

include_fields = []

如果can_edit_work_type:
include_fields.append('work_type')
如果can_edit_vendor:
include_fields.append 'vendor')
如果can_edit_note:
include_fields.append('note')

class OrderDetailForm(forms.ModelForm):
class Meta:
model = Order
fields = tuple(include_fields)

form = OrderDetailForm(instance = order,data = request.POST)

return render(request,'doors /order/detail.html',{'order':order,'form':form})

显然,我认为最好的做法是在 forms.py 而不是视图中定义 OrderDetailForm 。吡啶。那么如何将 OrderDetailForm 移动到 forms.py 并仍然通过 include_fields



我尝试过这样的东西,但没有工作



views.py

  def order_detail(request,pk):
order = Order .objects.get(pk = pk)

#在此定义can_something变量。

include_fields = []

如果can_edit_work_type:
include_fields.append('work_type')
如果can_edit_vendor:
include_fields.append 'vendor')
如果can_edit_note:
include_fields.append('note')

form = OrderDetailForm(instance = order,data = request.POST,include_fields = include_fields)

return render(request,'doors / order / detail.html',{'order':order,'form':form})

forms.py

 code> class OrderDetailForm(forms.ModelForm):
class Meta:
model = Order

def __init __(self,include_fields,* args,** kwargs)
super(OrderDetailForm,self).__ init __(* args,** kwargs)

self.Meta.fields = tuple(include_fields)
/ pre>

但是没有工作;它包括模型中的所有字段。我假设问题是面向对象。



欢迎任何提示或建议。感谢提前!

解决方案

您必须修改 self.fields 初始化器,删除序列中找不到的键。


My current setup in views.py looks like this

def order_detail(request, pk):
    order = Order.objects.get(pk=pk)

    # Define the can_something variables here.

    include_fields = []

    if can_edit_work_type:
        include_fields.append('work_type')
    if can_edit_vendor:
        include_fields.append('vendor')
    if can_edit_note:
        include_fields.append('note')

    class OrderDetailForm(forms.ModelForm):
        class Meta:
            model = Order
            fields = tuple(include_fields)

    form = OrderDetailForm(instance=order, data=request.POST)

    return render(request, 'doors/order/detail.html', {'order': order, 'form': form})    

Obviously I think it's best practice to define OrderDetailForm inside forms.py instead of views.py. So how do I move OrderDetailForm to forms.py and still pass include_fields?

I tried something like this but it didn't work

views.py

def order_detail(request, pk):
    order = Order.objects.get(pk=pk)

    # Define the can_something variables here.

    include_fields = []

    if can_edit_work_type:
        include_fields.append('work_type')
    if can_edit_vendor:
        include_fields.append('vendor')
    if can_edit_note:
        include_fields.append('note')

    form = OrderDetailForm(instance=order, data=request.POST, include_fields=include_fields)

    return render(request, 'doors/order/detail.html', {'order': order, 'form': form})    

forms.py

class OrderDetailForm(forms.ModelForm):
    class Meta:
        model = Order

    def __init__(self, include_fields, *args, **kwargs):
        super(OrderDetailForm, self).__init__(*args, **kwargs)

        self.Meta.fields = tuple(include_fields)

But that didn't work; it included all the fields on the model. I'm assuming the problem is in the object orientation.

Any tips or suggestions are welcomed. Thanks in advance!

解决方案

You have to modify self.fields in the initializer, removing keys in the mapping not found in the sequence.

这篇关于在Django中如何在ModelForm外部设置字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆