【问题标题】:Django - ModelForm - What if the instance does not exist yet?Django - ModelForm - 如果实例还不存在怎么办?
【发布时间】:2013-12-06 18:32:17
【问题描述】:

我有一个使用实例的模型表单,但用户第一次访问表单时,该实例还不存在。如果实例不存在,则会有一个空表单。

什么是最好的处理方法?另外,如何删除表单中的实例?

我应该改用 max_number = 1, can_delete= True 的 modelformset_factory 吗?

view.py:

def setLayerLabel(request, map_id, layerMapOptions_id):
    layerMapOptions = LayerMapOptions.objects.get(pk=layerMapOptions_id)
    layerLabel_selected = LayerLabel.objects.get(layerMapOptions=layerMapOptions)

    if request.POST:
        formset = layerLabelForm(request.POST, instance = layerLabel_selected)
        if formset.is_valid():
            instance = formset.save()
    else:
        formset = layerLabelForm(instance = layerLabel_selected)

    return render_to_response("basqui/manage_map_layerLabel.html", {'layer_label': layerLabel_selected, 'layerLabelformset': formset, 'layer': layerMapOptions.layer}, context_instance=RequestContext(request))

forms.py:

class layerLabelForm(BetterModelForm):
    def __init__(self, *args, **kwargs):
        super(layerLabelForm, self).__init__(*args, **kwargs)


    class Meta:
        model = LayerLabel
        fieldsets =  [('Label Options:', {'fields': ['field', 'font','font_size', 'font_color', 'halo_radius', 'halo_color', 'offset_x', 'offset_y'], 'classes': ['module']}),]

【问题讨论】:

  • 这里有什么问题?如果没有模型保存到数据库,那么表单当然应该是空的。

标签: django django-forms


【解决方案1】:

当您想要编辑数据库中已经存在的模型实例时,您只需要将实例提供给表单。如果您只想要模型的空白表单,那么您只需创建没有实例关键字参数的表单。我将在下面总结 ModelForm 的用法,但您的代码似乎需要进行一些更改。

注意:这些都不是用于表单集,当您想要提供多个表单时使用的不同野兽。

# GET request to get a blank form to create a new instance
form = MyModelForm()

# POST request to save a new instance
form = MyModelForm(request.POST)
form.save()

# GET request to get a form prefilled with values from an existing model instance
form = MyModelForm(instance=my_model_instance)

# POST request to save changes to an existing model instance
form = MyModelForm(request.POST, instance=my_model_instance)
form.save()

对于删除,是的,您可以使用 ModelFormSet,但您可能应该只在提供模型列表并允许用户删除其中一些时才这样做。如果您只显示一个模型的表单,那么只需制作一个不同的视图并发布您要删除的实例的 id/pk。在页面的某处创建一个“删除”按钮,并在用户单击它时发送请求(jQuery 使这很容易,或者只是使用另一个 HTML 表单)。这是一个您不想使用但演示概念的简单示例。

def delete_my_model(request):
    MyModel.objects.filter(pk=request.POST['pk']).delete()
    return HttpResponse()

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 2010-10-06
    • 2019-01-22
    • 2012-08-31
    • 1970-01-01
    • 2015-05-14
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多