2017-08-17 89 views
0

我尝试使用基于类的通用视图来更新在Django模型UpdateView.But我有一些实例问题。当我点击提交按钮ID被传递到更新的形式,但情况ISN “T如何在Django的ModelForm获得实例

我在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的某些部分。其余部分是相同的

SOLUTION

问题从我的更新按钮形式的method.its发生的方法是“后”。我把它改为“get”方法和问题solved.Don't NE教育署overried的UpdateView后function.Thanks到所有的解决方案。

BEFOR

 <form action="{% url 'inventory:hardware-update' hardwares.id %}" 
     method="post" style="display: inline;"> 
          {% csrf_token %}........... 

AFTER

 <form action="{% url 'inventory:hardware-update' hardwares.id %}" 
     method="get" style="display: inline;"> 
          {% csrf_token %}........... 
+0

请显示您的模板 – Alasdair

+0

我更新了问题并添加了模板的一部分。 –

+0

你重写get方法吗? –

回答

2

,则不应通常需要重写post仿制基于类的观点。

class HardwareUpdate(UpdateView): 
    model = Hardwares 
    form_class = HomeForm 
    template_name = 'inventory/update_form.html' 

你并不需要添加instance到模板的上下文:如果你把它简化为基于类视图将获取实例的照顾。会自动添加它,这样你就可以使用该模板{{ object }}{{ hardwares }}更新视图(hardwares是有点混乱,因为它是一个单一的对象 - 这将是更好地遵循Django的建议,并命名模型Hardware

+0

我试过这个,但没有效果 –

+0

“没有效果”是不够的信息来帮助。 – Alasdair

+0

我的updateView工作很清楚,我可以在其他项目中获得实例。但是当我创建表单并添加一些表单attrs时,我得到了这个问题。我认为这是源自forms.py –

0

使用self.get_object()方法

def post(self, request, *args, **kwargs): 
    instance = self.get_object() 
    form = HomeForm(request.POST, instance=instance) 

在HTML取代

{{ form.hardware_unit }} 

{{ instance }} 
+0

我试过但没有改变 –

+0

显示跟踪错误,将其添加到问题 –

+0

实际上,程序没有给出一些错误。我可以做一些数据更改并保存它,但实例不显示在表单 –

相关问题