为什么我需要运行第二个循环来获得django中的single值?

jutyujz0  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(115)

这个项目是为了创建一个过滤页面,用户可以根据他们选择的标准来过滤模型数据。整个项目都在工作,但是有一个特定的部分不清楚,没有意义。
这是我的模型-

class Author(models.Model):
    name=models.CharField(max_length=30)

    def __str__(self):
        return self.name

class Kategory(models.Model):
    name=models.CharField(max_length=20)

    def __str__(self):
        return self.name        

class Data(models.Model):
    title=models.CharField(max_length=120)
    author=models.ForeignKey(Author, on_delete=models.CASCADE)
    categories=models.ManyToManyField(Kategory)
    publish_date=models.DateTimeField()
    views=models.IntegerField(default=0)
    reviewed=models.BooleanField(default=False)

    def __str__(self):
        return self.title

数据模型是主要的模型,作者作为ForeignKey和Kategory作为多对多的字段被添加,我的主要问题是围绕数据模型中与Kategory模型有多对多关系的这个类别字段。
这是我的views.py文件-

# This view is for the filter page

def is_valid_queryparam(param):
    return param !='' and param is not None

def filter(request):
    qs=Data.objects.all()
    kategory=Kategory.objects.all()
    title_contains_query=request.GET.get('title_contains')
    id_exact_query=request.GET.get('id_exact')
    title_or_author_query=request.GET.get('title_or_author')
    view_count_min=request.GET.get('view_count_min')
    view_count_max=request.GET.get('view_count_max')
    date_min=request.GET.get('date_min')
    date_max=request.GET.get('date_max')
    category=request.GET.get('category')

    if is_valid_queryparam(title_contains_query):
        qs=qs.filter(title__icontains=title_contains_query)

    if is_valid_queryparam(id_exact_query):
        qs=qs.filter(id=id_exact_query)

    if is_valid_queryparam(title_or_author_query):
        qs=qs.filter(Q(title__icontains=title_or_author_query) | Q(author__name__icontains=title_or_author_query))

    if is_valid_queryparam(view_count_min):
        qs=qs.filter(views__gte=view_count_min)   

    if is_valid_queryparam(view_count_max):
        qs=qs.filter(views__lte=view_count_max)

    if is_valid_queryparam(date_min):
        qs=qs.filter(publish_date__gte=date_min)

    if is_valid_queryparam(date_max):
        qs=qs.filter(publish_date__lte=date_max)

    if is_valid_queryparam(category):
        qs=qs.filter(categories=category)     

    test=Data.objects.only('author')

    context={'queryset':qs, 'kategory':kategory, 'test':test}    

    return render(request, 'myapp/filter.html', context)

正如你在www.example.com中看到views.py,我有两个变量保存了所有的Data和Kategory模型数据。我以前已经用过很多次这种类型的东西了。当在django模板上显示一个表中的数据时,我们只需要运行一个for循环。这次我只是不能在categories字段中得到变量。所有其他字段都工作得很好。它不是给我这个值,而是输出None或者myapp.kategory.none或者类似的东西。我不得不运行一个额外的循环来获得categories值。我只是不明白为什么我必须运行这个额外的循环来获得这个值。如果有人能解释一下,或者甚至引导我找到一些解释它的文献,这将是有帮助的。
下面是我运行的额外循环的模板代码。查看第三个标签可以看到额外的循环。我应该只通过journal. categories获得值。为什么我需要运行这个循环?-

<table class="three">
    <tr >
        <th>Title</th>
        <th>Author</th>
        <th>Category</th>
        <th>Views</th>
        <th>Date Published</th>
        
        
    </tr>
    
    {% for journal in queryset %}
        
    
        <tr >
            <td>{{ journal.title }}</td>
            <td>{{ journal.author }}</td>
            <td>{% for cat in journal.categories.all %}
              {{ cat }}
            {% endfor %}</td>
            <td>{{ journal.views }}</td>
            <td>{{ journal.publish_date }}</td>
            
            
           
        </tr>    
        {% endfor %}    
</table>
icnyk63a

icnyk63a1#

您尚未定义ForeignKey.related_name,因此应使用default,以便:

<table class="three">
    <tr>
        <th>Title</th>
        <th>Author</th>
        <th>Category</th>
        <th>Views</th>
        <th>Date Published</th>
        
        
    </tr>
    
    {% for journal in queryset %}
        
    
        <tr>
            <td>{{ journal.title }}</td>
            <td>{{ journal.author }}</td>
            <td>{% for cat in journal.categories %}
              {{ cat }}
            {% endfor %}</td>
            <td>{{ journal.views }}</td>
            <td>{{ journal.publish_date }}</td>
            
            
           
        </tr>    
        {% endfor %}    
</table>

此外,我建议您在__str__()模型方法中使用f-stings,以便:

class Author(models.Model):
    name=models.CharField(max_length=30)

    def __str__(self):
        return f"{self.name}"

class Kategory(models.Model):
    name=models.CharField(max_length=20)

    def __str__(self):
        return f"{self.name}"        

class Data(models.Model):
    title=models.CharField(max_length=120)
    author=models.ForeignKey(Author, on_delete=models.CASCADE)
    categories=models.ManyToManyField(Kategory)
    publish_date=models.DateTimeField()
    views=models.IntegerField(default=0)
    reviewed=models.BooleanField(default=False)

    def __str__(self):
        return f"{self.title}"

相关问题