我有一个使用实例的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']}),]
答案 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()