多对多模型的Django表单。如何从视图/模板填写表单?

si

因此,我有2个通过Many-to-many关系关联的模型因为我需要一个额外的文件,所以我正在使用额外的模型CategoryByDay

基本上,我想要在应用程序中创建一个习惯或日常清单,以记录我今天要做的各种事情。因此,我想将每个新的一天与每个类别联系起来并记录其状态(如果完成了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但是当我单击“提交”并以我的方式对其进行调试时,出现了我尚未填写日期和类别表单的错误。

有人可以告诉我如何进行吗?

si

我设法使它起作用。

对于以后因意外搜索和进入此页面的任何人,这是我的工作。

1.更改了CategoryByDayForm的形式,使其仅接受状态并且不包括日期和类别

表格

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 %}
# ...

最后,在视图中,我操纵了所获得的表单,因此添加了缺失的元素(从具有状态的表单中,我仍然需要设置日期和类别)

views.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()

...

希望它能对以后的人有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有多个模型和视图的多页 Django 表单

来自分类Dev

无需注册即可填写多页表单-条目未填写

来自分类Dev

Django现有表单上的多对多

来自分类Dev

如何使Django表单覆盖模型?

来自分类Dev

如何使Django表单覆盖模型?

来自分类Dev

Django和多图像上传表单

来自分类Dev

具有继承后的请求的多视图中的一种Django表单

来自分类Dev

多对多(has_many:through)-表单如何添加子项?

来自分类Dev

多对多(has_many:through)-表单如何添加子项?

来自分类Dev

多页表单提交

来自分类Dev

多页面表单架构

来自分类Dev

多模型嵌套选择类型下拉表单提交

来自分类Dev

多视图表单AngularJS重新路由

来自分类Dev

如何循环填写表单控件?

来自分类Dev

在基于类的视图中自动填写表单

来自分类Dev

Django多对多模型DRF

来自分类Dev

如何使用模型属性验证Django表单?

来自分类Dev

如何从模型属性填充django管理表单?

来自分类Dev

Django 如何添加表单以外的模型

来自分类Dev

如何编写基于Django类的视图以用于其他模板的表单显示和提交?

来自分类Dev

如何将HTML表单集成到Django视图和模型中?

来自分类Dev

Django模板表单渲染

来自分类Dev

Django表单与模板

来自分类Dev

如何获取Django视图以返回表单错误

来自分类Dev

Django数据保存模型,模板中没有表单

来自分类Dev

Django的。内联表单集与模板中模型的现有实例

来自分类Dev

python django:目录中的视图、模型和表单

来自分类Dev

Django:如何创建视图以更新具有多对多关系的中间模型上的多个记录?

来自分类Dev

带有多对多映射的 Symfony 表单