2017-01-10 21 views
0

在Bookstore應用程序中,我有一個表單,用於添加由AuthorShelf編寫的Book,它屬於Bookstore。一本書需要與一個書架相關聯。使用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

如果表單將填充多個模型會怎麼樣?我認爲這應該是一個更合適的問題。是的,我知道如何使用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'繼承,但它是相同的概念。我簡化了前端,但沒有什麼能阻止你定製前端。我只是給你建議,而不是複製粘貼解決方案。 –

相關問題