【问题标题】:Django Populate Dropdown Menu With Choices From Many To Many DatabaseDjango 使用多对多数据库的选项填充下拉菜单
【发布时间】:2020-03-12 05:10:32
【问题描述】:

我想用来自主题表的记录填充我的下拉菜单,这是一个多对多选择字段,通过从管理页面手动添加主题来填充主题。一门课程可以有许多科目,例如“商业”和“市场营销”。

代码:

https://dpaste.de/825n

我将如何使用 django-select2 或使用带有模型选择或多个模型选择的表单?

https://docs.djangoproject.com/en/2.2/ref/forms/fields/#modelchoicefield

https://docs.djangoproject.com/en/2.2/ref/forms/fields/#modelmultiplechoicefield

https://django-select2.readthedocs.io/en/latest/

或者我可以在模板上使用 for 循环来做到这一点?

对于我尝试过但没有运气的循环:

https://dpaste.de/5MVi

期望的结果:

https://imgur.com/a/Iw9lk6I

有人可以帮我弄清楚吗?我已经卡了一段时间了。

【问题讨论】:

标签: python django django-models django-forms django-templates


【解决方案1】:

希望这有助于您在查询多对多字段时错过 .all()。您还没有深入了解多对多字段的实际名称,因此您尝试在循环中打印对象。

示例视图:

def tester(request):

    tes = Test.objects.get(id=1)
    testlist = tes.category.all()
    context = {
        'test': testlist,
    }
    return render(request, 'core/t.html', context)

示例循环:

{% for item in test %}
<p>- {{item.cat}}</p>
{% endfor %}

示例模型:

class cats(models.Model):
    cat = models.CharField(max_length=10,)

class Test(models.Model):
    name = models.CharField(max_length=10,)
    category = models.ManyToManyField(cats)

嵌套循环示例:

{% for item in item_list %}
<h2>{{ item.name }}</h2>
<ul>
    {% for sub in item.subjects.all %}
    <li><a href="#" id="">{{ sub.name }}</a></li>
    {% endfor %}
</ul>
{% endfor %}

【讨论】:

  • 你能帮我满足我的代码吗?我尝试按照您的建议进行操作,但我没有从 for 循环中获得所需的结果。 dpaste.de/3ezY
  • 1.我在示例中使用了基于函数的视图,因此通过将其添加到基于类的视图中,它甚至不会出现。所以要么将其用作独立视图,要么使其成为基于类的视图。
  • 2.你的代码有错字不是 testlist = test.category.all() 它的 testlist = test.subjects.all()
  • 这是有道理的。是否有可能以某种方式将它放在 CourseListView 中?这就是 urls.py 指向的地方 -> path('', CourseListView.as_view(), name='list')。我希望能够在 course_list.html 页面上显示下拉列表。我尝试将函数放在 CourseListView 函数之外,但它仍然没有产生预期的结果。也修正了错字。
  • 我避免为我的客户的生产应用程序使用内置的 ListView,因为它感觉有限。这是一个有争议的观点,虽然大声笑。所以我不是回答这个问题的最佳人选。但是你总是可以在你的主循环中尝试在模板中使用“your_object.subjects.all()”的嵌套循环。我再次避免在模板中做那么多逻辑,所以我在那里伸展。
【解决方案2】:

创建模型表单后,您可以使用类似这样的内容来获取下拉菜单

class CourseForm(forms.ModelForm):
    subjects = forms.ModelMultipleChoiceField(
        queryset=Subject.objects.all(),
        required=True,
        )
    class Meta:
        model = Course
        fields = [......, subjects]

或者您可以使用其他小部件,widget=forms.CheckboxSelectMultiple,具体取决于您的要求

<form method="post" action="">
<div>
{% csrf_token %}
{{ form }}              
<input type="submit" class="btn btn-primary" id="submit" value="Save">
</div>
</form>

添加一个创建视图来创建一个类似下面的课程

class CourseCreateView(CreateView):
    model = Course
    form_class = CourseForm
    template_name = 'course_form.html'
    success_url = reverse_lazy('/')

【讨论】:

  • 我把你的代码放在哪里?在models.py中?我会用主题或课程替换 YourModel 吗? ……是为了什么?为什么我需要为下拉菜单使用单选按钮或复选框?我会使用 modelmultiplechoicefield 而不是 ModelChoiceField?
  • 创建forms.py文件并在其中编写代码,您的模型将是课程,小部件是可选的,您可以使用模型多选字段
  • 更新了答案,将课程中的字段添加到虚线处。
  • 仍然没有得到想要的结果。我错过了什么吗?我需要在 HTML
  • 一个基本的表单模板示例也显示在更新的答案中,如果用户想要创建课程,您可以创建一个视图,然后将表单作为上下文传递以使用此模板
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 2011-11-12
  • 2013-08-12
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
相关资源
最近更新 更多