如何在 Django ModelForm 中获取实例
Posted
技术标签:
【中文标题】如何在 Django ModelForm 中获取实例【英文标题】:How get Instance in Django ModelForm 【发布时间】:2017-08-17 12:27:14 【问题描述】:我正在尝试使用基于类的通用视图 UpdateView 更新 Django 中的模型。但是我遇到了一些实例问题。当我单击提交按钮时,id 传递给更新表单,但实例不是
我是 django 的新手,所以如果我做了一些愚蠢的事情,请原谅。
urls.py
app_name = 'inventory'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^inventory/(?P<pk>[0-9]+)/delete/$', views.HardwareDelete.as_view(), name='hardware-delete'),
url(r'^inventory/update/(?P<pk>[0-9]+)/$', views.HardwareUpdate.as_view(), name='hardware-update'),
# url(r'^/inventory/add$', views.InventoryAdd.as_view(), name='add-inventory'),]
models.py
class Hardwares(models.Model):
hardware_unit=models.CharField(max_length=100)
hardware_model=models.CharField(max_length=100)
hardware_subsystem=models.CharField(max_length=100)
hardware_serial_number=models.CharField(max_length=1000)
hardware_manufacturer = models.CharField(max_length=1000)
hardware_operating_system = models.CharField(max_length=1000)
hardware_quantity = models.IntegerField(default=1, validators=[MinValueValidator(1)])
def get_absolute_url( self ):
return reverse('inventory:index')
def __str__(self):
return self.hardware_serial_number+" "+self.hardware_model+" "+self.hardware_unit+" "+str(self.hardware_quantity)
forms.py
class HomeForm(forms.ModelForm):
hardware_unit = forms.CharField(
widget=forms.TextInput(attrs='class': 'form-control', 'placeholder': 'Hardware Unit Name..', ))
hardware_model = forms.CharField(
widget=forms.TextInput(attrs='class': 'form-control', 'placeholder': 'Model Name...', ))
hardware_subsystem = forms.CharField(
widget=forms.TextInput(attrs='class': 'form-control', ))
hardware_serial_number = forms.CharField(
widget=forms.TextInput(attrs='class': 'form-control', ))
hardware_manufacturer = forms.CharField(
widget=forms.TextInput(attrs='class': 'form-control', 'placeholder': 'Manufacturer Company Name', ))
hardware_operating_system = forms.CharField(
widget=forms.TextInput(attrs='class': 'form-control', 'placeholder': 'Operating System Name', ))
hardware_quantity = forms.IntegerField(validators=[MinValueValidator(1)],
widget=forms.NumberInput(attrs='class': 'form-control', 'placeholder': 'Quantity of Harware', ))
class Meta:
model = Hardwares
fields = 'hardware_unit', 'hardware_model', 'hardware_subsystem', 'hardware_serial_number',
'hardware_manufacturer', 'hardware_operating_system', 'hardware_quantity',
views.py
class HardwareUpdate(UpdateView):
model = Hardwares
template_name = 'inventory/update_form.html'
form_class = HardwareForm
update.form html
% extends 'inventory/basic_menu.html' %
% block body %
<form class="form-horizontal" action="" method="post"
enctype="multipart/form-data">
% csrf_token %
<div class="form-group">
<label class="col-md-3 control-label">Hardware
Unit</label>
<div class="col-md-9">
form.hardware_unit
<span class="help-block">Hardware Unit Name eg.: Firewall , Notebook , Phone</span>
</div>
</div>
//Have more 8 form groups like this
% endblock body %
这是我的 update_form.html 的一部分。其余部分相同
解决方案
我的更新按钮表单的方法出现问题。它的方法是“发布”。我将其更改为“获取”方法并解决了问题。不需要覆盖 Updateview 发布功能。感谢大家的解决方案。
之前
<form action="% url 'inventory:hardware-update' hardwares.id %" method="post" style="display: inline;"> % csrf_token %...........
之后
<form action="% url 'inventory:hardware-update' hardwares.id %" method="get" style="display: inline;"> % csrf_token %...........
【问题讨论】:
请出示您的模板 我更新了问题并添加了我的模板的一部分。 你重写了get方法吗? 不,我没有。我认为不需要覆盖 get 方法。我搜索了有关 updateview 的相同示例,但我没有在示例中看到覆盖 get 方法 顺便说一句,最好在表单中使用[...]
列表而不是...
集合fields
。
【参考方案1】:
对于基于通用类的视图,您通常不需要覆盖 post
。如果您将基于类的视图简化为:
class HardwareUpdate(UpdateView):
model = Hardwares
form_class = HomeForm
template_name = 'inventory/update_form.html'
您无需将instance
添加到模板上下文中。更新视图会自动添加它,所以你可以在模板中使用 object
或 hardwares
(hardwares
有点混乱,因为它是一个单一的对象——最好遵循 Django 的建议并命名你的模型Hardware
)
【讨论】:
我的 updateView 工作清晰,我可以在其他项目中获取实例。但是当我创建表单并添加一些表单属性时,我遇到了这个问题。我认为这是源自 forms.py 尝试缩小问题所在。如果您将模板简化为使用 form
,它是否有效?去掉form_class = HomeForm
,使用自动生成的表单,是否有效?
@khayyam_islamzadeh 你最后是怎么解决问题的?
当我删除 form_class 时。它得到“字段”错误,并且在我在 HardwareUpdate 类中定义字段之后..这次显示了表单字段,但没有显示实例。
当我定义字段 object.hardware_unit 时,它会显示它们的实例,但这次字段不以上是关于如何在 Django ModelForm 中获取实例的主要内容,如果未能解决你的问题,请参考以下文章
Django ModelAdmin 从 ModelForm 获取查询集
如何在 Modelform 的网格中呈现 Django CheckoxInput?