Python 如何在Django ModelForm中获取实例
我正在尝试使用基于类的通用视图UpdateView更新Django中的模型。但我有一些实例问题。当我单击“提交”按钮时,id为“传递到更新表单”,但实例不是 我是django的新手,所以如果我做了傻事,请原谅 url.pyPython 如何在Django ModelForm中获取实例,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我正在尝试使用基于类的通用视图UpdateView更新Django中的模型。但我有一些实例问题。当我单击“提交”按钮时,id为“传递到更新表单”,但实例不是 我是django的新手,所以如果我做了傻事,请原谅 url.py app_name = 'inventory' urlpatterns = [ url(r'^$', views.IndexView.as_view(), name='index'), url(r'^inventory/(?P<pk>[0-9]+)/delete/
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'),]
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)
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', }
class HardwareUpdate(UpdateView):
model = Hardwares
template_name = 'inventory/update_form.html'
form_class = HardwareForm
forms.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'),]
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)
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', }
class HardwareUpdate(UpdateView):
model = Hardwares
template_name = 'inventory/update_form.html'
form_class = HardwareForm
视图.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'),]
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)
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', }
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 %}
{%extends'inventory/basic_menu.html%}
{%block body%}
{%csrf_令牌%}
硬件
单位
{{form.hardware_unit}
硬件单元名称,例如:防火墙、笔记本、电话
//有更多的8个这样的表单组
{%endblock body%}
这是我的update_form.html的一部分,其余部分是相同的
解决方案
我的更新按钮表单的方法出现了问题。它的方法是“post”。我将其更改为“get”方法并解决了问题。不需要过度使用Updateview post函数。感谢所有人提供解决方案
之前
<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 %}...........
{%csrf_令牌%}。。。。。。。。。。。
之后
<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 %}...........
{%csrf_令牌%}。。。。。。。。。。。
对于基于类的通用视图,通常不需要重写
post
。如果将实例简化为:
class HardwareUpdate(UpdateView):
model = Hardwares
form_class = HomeForm
template_name = 'inventory/update_form.html'
您不需要将
实例
添加到模板上下文中。更新视图将自动添加它,因此您可以在模板中使用{{object}
或{{hardwares}
(hardwares
有点混乱,因为它是一个单一的对象--最好按照Django的建议命名您的模型hardwares
)对于基于类的通用视图,通常不需要重写post
。如果将实例简化为:
class HardwareUpdate(UpdateView):
model = Hardwares
form_class = HomeForm
template_name = 'inventory/update_form.html'
您不需要将
实例
添加到模板上下文中。更新视图将自动添加它,因此您可以在模板中使用{{object}
或{{hardwares}
(hardwares
有点混乱,因为它是一个单一的对象--最好按照Django的建议命名您的模型hardwares
)my updateView清楚地查看了工作情况,我可以在其他项目中获得实例。但是当我创建表单并添加一些表单属性时,我遇到了这个问题。我认为这是源于表单。p请尝试缩小问题的范围。如果您将模板简化为使用{{form}
,是否有效?如果您删除form_class=HomeForm
并使用自动生成的表单,是否有效?@khayyam_islamzadeh您最终是如何解决问题的?当我删除form_class时。当我在HardwareUpdate类中定义字段后,它会出现“fields”错误。这次会显示表单字段,但不会显示实例。当我定义字段{{object.hardware_unit}时,它显示了它们的实例,但这次字段不起作用。我的更新视图工作得很清楚,我可以在其他项目中获得实例。但是当我创建表单并添加一些表单属性时,我遇到了这个问题。我认为这是源于forms.py尝试缩小问题的范围。如果您将模板简化为使用{{form}
,是否有效?如果您删除form_class=HomeForm
并使用自动生成的表单,是否有效?@khayyam_islamzadeh您最终是如何解决问题的?当我删除form_class时。它获取“字段”错误,在我在HardwareUpdate类中定义字段之后..这次显示表单字段,但不显示实例。当我定义字段{object.hardware_unit}时,它显示它们的实例,但这次字段不显示您的模板。我更新了问题并添加了我模板的一些部分。是否覆盖了get方法?否,我没有。我认为不需要重写get方法。我搜索了关于updateview的相同示例,但我没有在示例中看到重写get方法。另外,最好使用列表[…]
而不是集合{…}
对于表单中的字段
。请显示您的模板。我更新了问题并添加了我模板的一些部分。您是否覆盖了get方法?不,我没有。我认为不需要覆盖get方法。我搜索了关于updateview的相同示例,但在示例中没有看到覆盖get方法。除此之外,最好使用列表[…]
而不是表单中字段的集{…}
。