django 从一个HTML模板调用时,Model方法不返回

im9ewurl  于 2023-03-20  发布在  Go
关注(0)|答案(1)|浏览(102)
class Food(models.Model):
    fdc_id = models.PositiveIntegerField(primary_key=True)
    name = models.CharField(max_length=200)
    def get_absolute_url(self):
        return reverse('food-detail', args=[str(self.fdc_id)])

models.py

from django.urls import path
from . import views, urls
from django.urls import include

urlpatterns = [
    path('', views.index, name='index'),
    path('foods/', views.FoodListView.as_view(), name='foods'),
    path('foods/<int:pk>', views.FoodDetailView.as_view(), name='food-detail'),
]
urlpatterns += [
        path('myfoods/',views.FoodsEatenByUser.as_view(), name='my-eaten'),
        ]

urls.py

class FoodListView(LoginRequiredMixin, generic.ListView):

    model = Food
    context_object_name = 'food_list'
    queryset = Food.objects.filter(name__contains='kale').order_by('calcium').values()[:50]

views.py

{% extends "base_generic.html" %}
{% block content %}
    <h1>Food List</h1>
    {% if food_list %}
    <ul>
        {% for food in food_list %}
            <li>
                <a href="{{ food.get_absolute_url }}">{{ food.name }}</a> ({{food.fdc_id}})
            </li>
        {% endfor %}
    <ul>
    {% else %}
        <p>There are no foods in the database</p>
    {% endif %}
{% endblock %}

food_list.html
food_list页面按照我的预期显示,但是get_absolute_url返回的url是/catalog/foods
然而,如果我手动输入url,它会把我带到对象的详细页面,在那里方法返回正确的url。

{% extends 'base_generic.html' %}
{% block content %}
<h1>Food View</h1>

<a href="{{ food.get_absolute_url }}">{{ food.name }}</a> ({{food.fdc_id}})
<p>{{ food.name}}</p>

{% for f,v in food.get_fields %}

  
   <p> {{ f }}: {{ v }} </p>

{% endfor %}
{% endblock %}

food_detail.html
在food_detail中,返回的URL为/catalog/foods/<fdc_id>
此外,列表页面上的链接确实有一次转到了正确的详细信息页面,我不知道它是什么时候停止工作的。
我在Food模型中添加了一个返回“hello world”的函数,同样的事情也发生了,在food_detail模板中调用该函数时,该函数可以工作,但在food_list模板中调用该函数时,该函数不能工作。
为什么food_list模板中的方法不返回?

toiithl6

toiithl61#

您应该使用**.values(…)**[Django-doc]。.values(…)返回 * dictionary * 的QuerySet。字典没有get_absolute_url方法,因此出现错误。
你应该让Django返回 objects,所以:

class FoodListView(LoginRequiredMixin, generic.ListView):
    model = Food
    context_object_name = 'food_list'
    queryset = Food.objects.filter(name__contains='kale').order_by('calcium')[:50]

相关问题