2014-02-06 49 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'), 
)