【问题标题】:How do I set fields in ModelForm externally in Django?如何在 Django 外部设置 ModelForm 中的字段?
【发布时间】:2012-05-18 23:33:38
【问题描述】:

我在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')

    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 而不是 views.py。那么如何将OrderDetailForm 移动到forms.py 并且仍然通过include_fields

我尝试了类似的方法,但没有成功

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)

但这没有用;它包括模型上的所有字段。我假设问题出在面向对象上。

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

【问题讨论】:

    标签: python django-forms django-views


    【解决方案1】:

    您必须在初始化程序中修改self.fields,删除在序列中未找到的映射中的键。

    【讨论】:

    • 迭代self.fields。删除不在序列中的键。
    • self.fields 是字典列表吗?我不明白我是否应该做类似self.fields = ('one', 'two') 的事情,或者我是否必须明确设置类似self.fields['one'] = SomeFieldInput() 的内容(但是如果我必须明确说明字段输入,那么拥有ModelForm 有什么意义)。如果我执行class Meta: fields = () 之类的操作,那意味着self.fields 最初是空的?
    【解决方案2】:

    查看 Django 代码,您可能想尝试使用self._meta.fields = tuple(include_fields)

    【讨论】:

    • 它不起作用,允许 Order 模型中的所有字段。
    • 尝试将Meta-munging 移到super() 调用上方。
    • 喜欢换行self._meta.fields = tuple(include_fields)super(OrderDetailForm, self).__init__(*args, **kwargs)?那仍然没有用。它仍然显示每个字段。
    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2013-01-03
    • 1970-01-01
    • 2011-03-17
    • 2018-08-21
    相关资源
    最近更新 更多