显示相关项目 django

Posted

技术标签:

【中文标题】显示相关项目 django【英文标题】:Show related item django 【发布时间】:2022-01-10 05:38:09 【问题描述】:

我有以下型号:

类类别(models.Model): 名称 = models.CharField(max_length=255)

类元素(models.Model):

category = models.ForeignKey(Category)
name = models.CharField(max_length=255)

类主题(models.Model):

category = models.ForeignKey(Category)

element = models.ForeignKey(Element) 名称 = models.CharField(max_length=255)

我基本上需要在类别 id =1 中添加新主题,并且只获取属于类别 1 的 élément 列表

我在类别 id =1 中创建了一个视图新主题,但对于表单中的字段元素,我获取所有类别的所有元素

【问题讨论】:

【参考方案1】:

你好,

在models.py下面

class Category(models.Model):
    name = models.CharField(max_length=50, unique=True)
    description = models.CharField(max_length=150)

class Element(models.Model):
    category = models.ForeignKey(Category, related_name='elements', on_delete=models.CASCADE)
    element = models.CharField(max_length=50)

class Topic(models.Model):
    subject = models.CharField(max_length=255)
    element = models.ForeignKey(KPI, related_name='topics', on_delete=models.CASCADE)
    category = models.ForeignKey(Category, related_name='tickets', on_delete=models.CASCADE)
    created_by = models.ForeignKey(User, related_name='tickets', on_delete=models.CASCADE)
    created_date = models.DateTimeField(auto_now_add=True)
   

views.py

def new_topic(request, category_id):
    category = get_object_or_404(Category, pk=category_id)
    kpi = KPI.objects.select_related().filter(category=category_id)
    #user = User.objects.first()
    if request.method == "POST":
        form = NewTopicForm(request.POST)

        if form.is_valid():
           topic = form.save(commit=False)
           topic.category = category
           topic.created_by = request.user
           topic.save()

       

           post = Post.objects.create(
                message=form.cleaned_data.get('message'),
                
                topic=topic
           )
           return redirect('category_topic', category_id=category.pk)
    else:

        form = NewTopicForm()

    return render(request, 'new_topic.html', 'category': category, 'form':form
                  )

forms.py

class NewTopicForm(forms.ModelForm):

    message = forms.CharField(widget=forms.Textarea, max_length=6000)

    class Meta:
        model = Topic
        fields = ['subject', 'issue_date', 'message', 'element']

一些元素是由管理界面创建的,例如

类别_1 个元素_1 类别_1 元素_2 类别_2 元素_3

问题是当我需要在 category_1 中创建新主题时,我只需要显示属于类别 1 的元素而不是所有元素

谢谢

【讨论】:

【参考方案2】:

为此,您应该在Element 模型的category 字段中添加一个related_name

category = models.ForeignKey(Category, related_name='elements')

然后,当您有一个主题对象时,您可以通过 obj.category.elements 访问主题类别的元素。

如果您打算获取某个类别中的帖子列表,您将对从主题到类别的 FK 执行相同的操作(显然使用不同的名称)。

【讨论】:

感谢您的回复,我已经添加了 finame 但仍然无法正常工作,我的问题是当我添加新主题时(主题名称和元素名称应该是带有选项的参考字段)我得到了所有元素所有类别的结果,即使我属于类别 1 如果您可以用您实际在做什么来扩展您的问题并举例说明您的期望与输出是什么,这将会很有帮助。

以上是关于显示相关项目 django的主要内容,如果未能解决你的问题,请参考以下文章

如何使用列表中显示的相关项目的下拉列表使特定模型类的 Django contrib Admin 更改列表可编辑?

Django 多外键导航

Django admin 中的自定义相关下拉菜单

django相关查询过滤器,搜索有无相关项目的项目

django-taggit - 如何显示与每条记录相关的标签

django 项目启动相关