2017-08-17 20 views
0

クラスベースの汎用ビューUpdateView.Butを使用してDjangoでモデルを更新しようとしています。インスタンスの問題がいくつかあります。送信ボタンをクリックするとidはフォームを更新するが、インスタンスはisn 'tDjango 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の一部であります更新ボタンフォームのmethod.itsメソッドが「投稿」でした。メソッドを取得して問題を解決するように変更しました。更新されたUpdateviewの投稿機能に挑戦しました。ソリューションのすべてに感謝します。

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

{{ form.hardware_unit }} 

を交換してください。あなたは、テンプレートのコンテキストにinstanceを追加する必要はありません

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

:あなたはそれを簡略化する場合、クラスベースのビューには、インスタンスを取得するの世話をします。テンプレートに{{ object }}または{{ hardwares }}を使用できるように更新ビューは自動的に(それは単一のオブジェクトだからhardwaresは少し混乱している - Djangoの勧告に従うと、あなたのモデルHardwareに名前を付ける方が良いでしょう)、それを追加します

+0

私はこれを試みましたが、効果がありません –

+0

"効果がありませんでした"は助けになるほどの情報ではありません。 – Alasdair

+0

私のupdateViewの仕事ははっきりと私はフォームを作成し、いくつかのフォームを追加するときに他のproject.butのインスタンスを取得することができますattrs私はこれがforms.pyから発信されたと思います –

0

使用self.get_object()方法

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

は、あなたは通常、一般的なクラスベースのビューのためにpostを上書きする必要はありません

{{ instance }} 
+0

私は試しましたが、変更はありません –

+0

トレースエラーを表示し、質問に追加します –

+0

実際にはプログラムはいくつかのエラーを出しませんでした。私はデータのいくつかの変更を行うことができますが、それを保存しますが、フォームでテキストフィールドに表示されません –

関連する問題