2014-02-06 80 views
2

所以我有兩個模型,通過Many-to-many關係相關。因爲我需要一個額外的文件我正在使用額外的模型CategoryByDayDjango適用於多對多模型。如何從視圖/模板填充表單?

基本上我想在我的應用程序,是創建一個習慣或日常列表,將記錄我今天必須做的各種事情。所以我想把每個新的一天與每個類別連接起來,並記錄下它的狀態(如果它完成了1,如果不是0)。我使用CharField,因爲後來我想書籍閱讀等登錄其他的東西,這不是與此有關

models.py

from django.db import models 

class Day(models.Model): 
    name = models.CharField(max_length=8) 
    date = models.DateField() 

    def __unicode__(self): 
     return self.name 

class Category(models.Model): 
    name = models.CharField(max_length=100) 
    categoryBD = models.ManyToManyField(Day, through='CategoryByDay') 

    def __unicode__(self): 
     return self.name 

class CategoryByDay(models.Model): 
    day = models.ForeignKey(Day) 
    category = models.ForeignKey(Category) 
    status = models.CharField(max_length=64) 

在我html我要顯示的類別列表和形式靠近它的地方,只會發佈狀態和日期以及類別將自動填充。現在我不知道該怎麼做。這是我到目前爲止,閱讀一些論壇,您可以從視圖傳遞額外的數據(這不是工作,並形成需求,我填寫日期和類別形式)

views.py

def today(request): 
    if request.method == 'POST': 
#... POST validation here, not relevant 
    else: 
     day = datetime.date.today().strftime("%d/%m/%y") 
     categories_list = Category.objects.all() 
     category_form_list = [] 
# I am doing this strange list, because later in template I had problem 
# accessing list through iteration like forloop.counter. 
# I will access it via for x,y in pair 
     for category in categories_list: 
      data = {'day': day, 
      'category': category.name,} 
      form = CategoryByDayForm(data) 
      #So I tried adding data to form, it didn't work and can be ignored 
      part = [category, form] 
      category_form_list.append(part) 
     context = { 't': t, 
     'category_form_list': category_form_list,} 
     return render(request, 'today/today.html', context) 

這是我的表格,我猜應該早些時候添加它。

形式PY

class CategoryByDayForm(forms.ModelForm): 
    status = forms.CharField(max_length=64, initial="0") 
    day = forms.ModelMultipleChoiceField(queryset=Day.objects.all()) 
    category = forms.ModelMultipleChoiceField(queryset=Category.objects.all()) 
    class Meta: 
     model = CategoryByDay 

現在,形式我不確定我應該用什麼樣的形式類型,白天和類別。也許我應該忽略它?

最後模板:

今天HTML

#... 
    <ul> 
     {% for category, form in category_form_list %} 
      <li>     
       {{ category.name }} 
       <form action="" method="post"> 
        {% csrf_token %} 
        {{ form.non_field_errors}} 
        <div class="status"> 
         {{ form.status.errors}} 
         {{ form.status }} 
         <input type="submit" value="Submit" /> 
        </div> 
       </form> 
      </li> 
     {% endfor %} 
    </ul> 
#... 

這工作,通過只顯示一種形式status但是當我點擊我的方式提交和調試它,我有沒有填寫錯誤日期和類別表格。

有人可以告訴我如何進行?

+0

這樣做的一個簡單的方法是創建特定日期和類別的視圖(在URL中提到)。然後表單必須忽略日期和分類字段。它應該在保存表單時填充它們。 – arocks

+0

@arocks所以我遵循你的建議,從字段中刪除日期和類別,並設法在我的意見中設置一天。日子很簡單,因爲它一直在節約今天的日子。現在,有沒有辦法從模板發送類別名稱?我現在可以用request.category檢索它,只要我知道如何發送它。 – qnsi

+0

爲什麼不把它從像http://example.com/category/23/這樣的網址中獲得,其中23是類別ID? – arocks

回答

2

我設法讓它工作。

對於任何人在未來偶然使用谷歌搜索和在這裏得到這個網頁是我做的。

1.Changed CategoryByDayForm的形式,所以它僅接受狀態,不包括日期和類別

forms.py

from django import forms 
from today.models import CategoryByDay, Category, Day 

class CategoryByDayForm(forms.ModelForm): 
    status = forms.CharField(max_length=64, initial="0") 
    class Meta: 
     model = CategoryByDay 
     exclude = ['day', 'category'] 
  1. 在模板中,添加隱藏的表單輸入發送當前類迭代:

today.html

#... 
{% for category, form in category_form_list %} 
       <li>     
        {{ category.name }} 
        <form action="" method="post"> 
         {% csrf_token %} 
         {{ form.non_field_errors}} 
         <input type="hidden" value="{{ category.name }}" name="category"> 
         <div class="status"> 
          {{ form.status }} 
          <input type="submit" value="Submit" /> 
         </div> 
        </form> 
       </li> 
      {% endfor %} 
# ... 

最後,在視圖中,我操作我得到的形式,所以我加了缺失的元素(從形式我的狀態,我還需要設置日期和類別)

意見。PY

def today(request): 
    t = datetime.date.today().strftime("%d/%m/%y") 
    day = Day.objects.filter(name=t) 
    if request.method == 'POST': 
      form = CategoryByDayForm(request.POST) 
     if form.is_valid(): 
      category_status = form.save(commit=False) 
      category_status.day = day[0] 
      category_name = request.POST['category'] 
      category_status.category = Category.objects.filter(name=category_name)[0] 
      category_status.save() 
      form.save_m2m() 

...

希望能幫助別人的未來。

1

另一種解決方案 views.py:

class ViewIndex(TemplateResponseMixin, View): 
    template_name = 'frontend/view_index.html' 

    def dispatch(self, request, *args, **kwargs): 
     FS = modelformset_factory(CategoryByDay, extra=1) 
     queryset = CategoryByDay.objects.filter(day__date=datetime.date.today()) 

     if request.method == 'POST': 
      formset = FS(request.POST, request.FILES) 

      if formset.is_valid(): 
       formset.save() 
       formset = FS(queryset=queryset) 

     else: 
      formset = FS(queryset=queryset) 


     return self.render_to_response({'formset':formset}) 

前端/ view_index.html:

{% extends 'base.html' %} 
{% block content_main %} 
<form method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ formset.management_form }} 
    {% for form in formset %} 
     {{ form }} 
     <hr/> 
    {% endfor %} 

    <input type="submit"> 
</form> 
{% endblock %} 

和urls.py

urlpatterns = patterns('', 
    url(r'^$', ViewIndex.as_view(), name='view_index'), 
)