【问题标题】:Creating UpdateForm by using ModelForm in Django在 Django 中使用 ModelForm 创建 UpdateForm
【发布时间】:2020-07-13 06:47:29
【问题描述】:

我有一个 Django 应用程序,我想用 ModelForm 创建一个更新表单,但我必须从 user_profile 模型中获取 fields 参数。所以我创建了我的表单和视图,如下所示。

forms.py;

class UpdateForm(forms.ModelForm):
    class Meta:
        model = Data
        fields = []
        
    def __init__(self, *args, **kwargs):
        input_choices = kwargs.pop('input_choices')
        super(UpdateForm, self).__init__(*args,**kwargs)
        self.fields = input_choices

views.py;

@login_required(login_url = "user:login")
def updateData(request,id):
    features = request.user.profile.selected_features
    instance = get_object_or_404(Data,id = id)
    
    form = UpdateForm(request.POST or None, input_choices=features, instance=instance)

    if form.is_valid():
        data = form.save(commit=False)
        data.author = request.user
        data.save()
        return redirect("data:dashboard")
    return render(request,"update.html",{"form":form})

但是,我在 return render(request,"update.html",{"form":form}) 行中遇到了 list indices must be integers or slices, not str 错误。 fields 参数有问题,但我找不到任何东西。

如何将 fields 参数从视图传递到 ModelForm?

【问题讨论】:

  • 什么是features,您对input_choices 的预期输入是什么?您能否将Data 模型添加到您的问题和request.user.profile.selected_features 的结果中
  • 如您所知,ModelForm 的“字段”通常包含模型中的参数。但是在我的应用程序中,用户在注册时选择了参数。他们可以使用他们想要的东西。所以我的“特征”是我根据用户选择的一些模型参数。
  • 这些字段是完全动态的,而不是 Data 模型上的字段?
  • 数据模型上的字段,但不是全部,是的,它必须是动态的。例如;我的数据模型包含:姓名、用户名、电话号码等,但我的用户只选择了用户名参数,因此应该只使用用户名参数创建数据表单。

标签: django django-models django-forms django-views


【解决方案1】:

您可以使用modelform_factory 创建带有动态字段的表单

from django.forms import modelform_factory

@login_required(login_url = "user:login")
def updateData(request,id):
    features = request.user.profile.selected_features
    instance = get_object_or_404(Data, id=id)
    UpdateForm = modelform_factory(Data, fields=features)
    form = UpdateForm(request.POST or None, instance=instance)

如果features 是一个查询集,您可能必须使用features.values_list('name', flat=True) 之类的东西来获取字段的名称

【讨论】:

  • 我已经处理这个问题好几天了。非常感谢,它有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2020-07-24
  • 1970-01-01
  • 2014-07-22
  • 2016-02-15
  • 2010-09-11
  • 2012-04-29
相关资源
最近更新 更多