Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-ModelForm-如果实例还不存在怎么办?_Django_Django Forms - Fatal编程技术网

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

Django-ModelForm-如果实例还不存在怎么办?,django,django-forms,Django,Django Forms,我有一个使用实例的modelForm,但是当用户第一次访问表单时,实例还不存在。如果实例不存在,则会有一个空表单 处理这个问题的最好方法是什么?另外,如何删除表单中的实例 我是否应该使用max\u number=1的modelformset\u factory,是否可以改为\u delete=True view.py: def setLayerLabel(request, map_id, layerMapOptions_id): layerMapOptions = LayerMapOpt

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

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

我是否应该使用max\u number=1的modelformset\u factory,是否可以改为\u 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']}),]

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

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

# 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()

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