2017-08-17 88 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

實際上,程序沒有給出一些錯誤。我可以做一些數據更改並保存它,但實例不顯示在表單 –

相關問題