You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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转义字符&lt;int:id&gt;,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:15:09