2017-01-10 8 views
0

Bookstoreアプリケーションでは、とBookstoreに属するBookShelfで書かれたフォームを追加します。本はシェルフに関連付ける必要があります。save()メソッドを使用してDjangoでフォームデータを処理する簡潔な方法

class AddBookForm(forms.Form): 

    def save(self, request): 
     #Let's say I put an excrutiating number of fields...say 13. 
     book_name = self.cleaned_data.get('book_name', None) 
     book_author_pk = self.cleaned_data.get('book_author_pk', None) 
     book_genre = self.cleaned_data.get('genre', None) 
     book_price = self.cleaned_data.get('price', None) 
     book_summary = self.cleaned_data.get('book_summary', None) 
     bookshop_location = self.cleaned_data.get('bookshop_location', None) 
     bookshop_shelf_number = self.cleaned_data.get('bookshop_shelf_number', None) 
     stock = self.cleaned_data.get('stock', None) 
     promotional_price = self.cleaned_data.get('promotional_price', None) 

     author_object = Author.objects.get(pk=book_author_pk) 

     book = Book(
      name = book_name, 
      author = author_object, 
      genre = genre, 
      summary = book_summary 
     ) 
     book.save(force_insert=True) 

     shelf = Shelf(
      bookshop_location = bookshop_location, 
      shelf_number = bookshop_shelf_number, 
      stock = stock, 
      promotional_price = promotional_price 
     ) 
     shelf.save(force_insert=True, force_update=False) 

私の質問は、実際にはこれを書くより簡潔な方法はありますか?私はかなりあると確信していますが、私はどこかでそれを逃しています。

+2

'ModelForm'を意味しますか? – Sayse

+1

https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#modelform –

+0

フォームに2つ以上のモデルが設定されるとどうなりますか?私はそれがより適切な質問であるべきだと思います。はい、私はModelFormsの使い方を知っています。 – bryansis2010

答えて

1

あなたの代わりにこれを行うことができ、それらの値のどれを受け入れることはできません、あなたのモデルが明示的に上記のようなモデルに提供する必要はありませんただし場合、これは

class AddFruitForm(forms.Form): 

    def save(self, request):  
     # list all your fields here 
     fields_expected = ['fruit_name', 'fruit_color', ...] 

     # this should give you the dict with all the fields equal to "None" 
     fields = dict.fromkeys(fields_expected)  

     # this relace the None value with the good data from cleaned_data 
     fields.update(self.cleaned_data) 

     # assign all the in the dict to the model, key=value 
     fruit = Fruit(**fields) 
     fruit.save(force_insert=True, force_update=False) 

を試してみてくださいし、モデルを扱うようにしましょうデフォルト値

class AddFruitForm(forms.Form): 

    def save(self, request):  
     fields = self.cleaned_data 
     fields['my_custom_field'] = 'some data not from the field' 

     fruit = Fruit(**fields) 
     fruit.save(force_insert=True, force_update=False) 
1

データがモデルに関連付けられている場合は、ModelFormを使用することをお勧めします。フロントエンドで必要なだけ多くのフォームを作成して提出することができます。コードは実際にはまっすぐです:

# models.py 
class BookForm(forms.ModelForm): 
    class meta: 
     model = Book 

class Shelf(forms.ModelForm): 
    class meta: 
     model = Shelf 

# views.py 
def addbook(request): 
    book_form = BookForm(request.POST or None) 
    shelf_form = SelfForm(request.POST or None) 
    if book_form.is_valid() and shelf_form.is_valid(): 
     book = book_form.save() 
     shelf = shelf_form.save() 
     return redirect('some-list-view') 

    return render(request, 
        'addbook.html', 
        {'book_form': book_form, 'shelf_form': shelf_form}) 

# addbook.html 
<form action="/addbook/" method="post"> 
    {% csrf_token %} 
    {{ book_form }} 
    {{ shelf_form }} 
    <input type="submit" value="Submit" /> 
</form> 
+0

ええと、私はCBVを使用していますので、これは役に立たないでしょう。また、私はDjango Crispy Formsパッケージを使用していますので、フォームの外観とフィールドを適切に制御できるようにしたいと考えています。 – bryansis2010

+1

これでもCBVを使うことができますが、 'CreateView'ではなく、' View'から継承することもできますが、それは同じ概念です。私はフロントエンドを単純化しましたが、フロントエンドをカスタマイズすることを妨げるものは何もありません。私はちょうどあなたに提案を提出しています、コピーペーストソリューションではありません。 –

関連する問題