首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django:使用多个外键自定义内联格式集作为“通过”模型

Django:使用多个外键自定义内联格式集作为“通过”模型
EN

Stack Overflow用户
提问于 2014-01-12 22:03:38
回答 1查看 1.9K关注 0票数 1

我想做的是更改前端内联格式集的接口,以便复选框可以与“直通”模型上的两个不同外键字段相关联。基本上,我想把两个下拉列表合并成一个复选框。

在models.py中:

代码语言:javascript
复制
class Food(models.Model):
    name = models.CharField(max_length=10)        

class Day(models.Model):
    """Days of the week: Sunday, Monday, Tuesday, etc."""
    name = models.CharField(max_length=10)

class Meal(models.Model):
    """Breakfast, Lunch, Dinner"""
    name = models.CharField(max_length=10)

class Plan(models.Model):
    name = models.CharField()
    foods = models.ManyToManyField('Food',related_name='plans')
    days = models.ManyToManyField('Day',related_name='plans',through='Schedule')
    meals = models.ManyToManyField('Meal',related_name='plans',through='Schedule')

class Schedule(models.Model):
    plan = models.ForeignKey(Plan)
    day = models.ForeignKey(Day)
    meal = models.ForeignKey(Meal)

每个计划都有一组相关的食物,然后通过进度表模型,在特定的日子里与特定的食物相关联。

我想有一个模型表单,用户可以创建一个用餐计划,在那里他们说他们将在哪一天吃什么食物。例如,用户可以先从一组食物中选择苹果和香蕉,然后他们应该能够选择在哪一天吃苹果和香蕉。

我的看法是:

代码语言:javascript
复制
def plan_add(request):
    form = forms.PlanForm();

    ScheduleFormSet = inlineformset_factory(Plan, Schedule)
    formset_schedule = ScheduleFormSet()

    response = render(request, 'template.html', {
        'form' : form,
        'formset_schedule' : formset_schedule,
    })
    return response

这给了我一个可以工作的表单,但是一个不友好的用户界面。对于您想要添加的每个日程,您必须先从下拉列表中选择日期,然后从第二个下拉列表中选择该餐。我想要的是7行表,每一行都有其中每一餐的复选框,您只需选中要放在日程上的餐框。因此,我想创建一个表单字段(一个复选框),该字段与计划模型中的两个外键字段相关联:。

我想知道是否有一种"Django“方法来处理这个问题,可能是通过重写inlineformset_factory来实现的,或者这是一件非常奇怪的事情,所以我应该手动构建这个表单,手动验证它,然后手动解析和保存数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-14 01:14:50

这就是我最后要做的。我没有使用inlineformset_factory,因为我无法获得使用内联窗体集所需的控件。对于食物,我用一个ModelMultipleChoiceField小部件指定了一个自定义的CheckboxSelectMultiple,然后每天都做同样的事情,获取这些日子并遍历它们。

代码语言:javascript
复制
class PlanForm(ModelForm):
    foods = forms.ModelMultipleChoiceField(
        queryset=Food.objects.all(), 
        required=False, 
        widget=forms.CheckboxSelectMultiple,
        label = "Foods:")

    def __init__(self, *args, **kwargs):
        super(PlanForm, self).__init__(*args, **kwargs)
        days = Day.objects.all()
        for day in days:        
            self.fields[day.name] = forms.ModelMultipleChoiceField(
                queryset=Meal.objects.all(), 
                required=False, 
                widget=forms.CheckboxSelectMultiple,
                label = day.name)

    class Meta:
        model = Plan
        fields = (['name','description','foods']+[day.name for day in Day.objects.all()])

这是获取我想要的表单的基本代码。然后,在模板中,您可以这样做,并添加自定义html:

代码语言:javascript
复制
{% for field in form %}
    {{ field.label_tag }}
    {% for choice in field %}
        {{choice}}
    {% endfor %}
{% endfor %}

最后,我还使用了这个解决方案:http://schinckel.net/2013/06/14/django-fieldsets/来获取字段集,这样我就可以对表单上的每个组进行不同的呈现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21080870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档