Django - ModelForm - 如果实例不存在怎么办?

时间:2013-12-06 18:32:18

标签: django django-forms

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

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

我应该使用带有max_number = 1的modelformset_factory,而不是can_delete = True吗?

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']}),]

1 个答案:

答案 0 :(得分:1)

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

注意:这些都不适用于formset,当你想提供表格的倍数时,它就是不同的野兽。

# 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,但是如果您要呈现模型列表并允许用户删除其中一些模型,您可能只应该这样做。如果您只显示一个模型的表单,那么只需创建一个不同的视图并POST您要删除的实例的id / pk。在页面的某处创建一个“删除”按钮,并在用户单击它时发送请求(jQuery使这很简单或只使用另一个HTML表单)。这是一个您不想使用的简单示例,但演示了这个概念。

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