Django无法获取绝对URL:登录供应商无法访问supplier_data链接
问题排查与修复方案
1. 模型字段参数错误
company_name是关联User的OneToOneField,但错误添加了max_length=120参数——OneToOneField不支持该参数,会导致模型无法正常迁移、数据无法正确保存,最终Supplier表中无对应数据,模板循环无内容输出。
修正代码:
class Supplier(models.Model): id = models.IntegerField(primary_key=True) # 移除无效的max_length参数 company_name = models.OneToOneField(User, on_delete=models.CASCADE) currency = models.CharField('Currency', max_length=4) legal_form = models.CharField('Legal form', max_length=100, choices=legal_form_options, default='Sole proprietorship') accounting_standards = models.CharField('Accounting standards', max_length=100) owner_structure = models.CharField('Owner structure', max_length=100) industry_sector = models.CharField('Industry sector', max_length=100, choices=industry_sector_options, default='Advertising') date_of_establishment = models.DateField('Date of establishment', default=date.today) start_up = models.CharField('Start-up', choices=start_up_options, default='No', max_length=4) email_address = models.EmailField('Email address') web = models.URLField('Website address') def get_absolute_url(self): return reverse('supplier_data', args=[self.id])
2. 视图上下文变量不匹配
supplier_data视图获取的是单个Supplier对象,但仍用supplier_list作为上下文变量名,模板中{% for supplier in supplier_list %}会因单个对象不可迭代而不执行,导致无内容显示。
修正代码:
def supplier_data(request, id): supplier = get_object_or_404(Supplier, pk=id) # 上下文变量改为单个supplier,建议单独创建supplier_data.html模板渲染详情 return render(request, 'supplier_data.html',{'supplier': supplier})
3. 路由路径格式错误
路由中使用了HTML转义字符<int:id>,Django无法正确解析路径参数,应直接使用原生的<int:id>格式。
修正代码:
path('supplier_data/<int:id>', views.supplier_data, name="supplier_data"),
4. 登录用户数据过滤缺失
需求是为已登录的供应商生成链接,但all_suppliers视图返回所有供应商,未过滤当前登录用户对应的Supplier。若当前用户无关联的Supplier记录,循环也会无内容。
修正代码:
from django.contrib.auth.decorators import login_required @login_required def all_suppliers(request): # 过滤当前登录用户对应的Supplier数据 supplier_list = Supplier.objects.filter(company_name=request.user) return render(request, 'all_suppliers.html',{'supplier_list': supplier_list})
模板简化建议
若仅为当前登录用户显示单条链接,可去掉循环逻辑,避免空元素:
{% if supplier_list %} <a id="link" href="{% url 'supplier_data' supplier_list.first.id %}">Supplier data</a> {% else %} <p>未找到您的供应商数据</p> {% endif %}
内容的提问来源于stack exchange,提问作者Piotr Połetek
相关产品推荐
相关产品推荐

