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

Django工单邮件表单如何获取外键关联模型字段值?

解决工单邮件中外键关联Customer字段无法正常显示的问题

你遇到的TypeError是因为form.cleaned_data.get('customer')返回的是Customer模型实例(或None),而"\n".join(body.values())要求所有值都是字符串类型,类型不匹配导致报错。以下是两种可行的解决方案:

方案1:在视图中直接提取Customer具体字段并处理空值

修改views.py中body字典的customer字段,明确提取客户的姓名、公司名等属性,同时处理customer为None的情况:

def createTicket(request):
    form = TicketForm(request.POST)
    if request.method == 'POST':
        if form.is_valid():
            subject = "Ticket Email"
            # 获取customer实例并拼接信息
            customer_instance = form.cleaned_data.get('customer')
            customer_info = '未指定客户'
            if customer_instance:
                customer_info = f"{customer_instance.first_name} {customer_instance.last_name} - {customer_instance.company_name}"
            
            body = {
                'customer': customer_info,
                'subject': form.cleaned_data.get('subject') or '无主题',
                'priority': form.cleaned_data.get('priority') or '普通',
                'details': form.cleaned_data.get('details') or '无详情',
            }
            message = "\n".join(body.values())
            form.save()
            try:
                send_mail(subject, message, 'from_email', [form.cleaned_data.get('technician_email')])
            except BadHeaderError:
                return HttpResponse('Invalid Header')
            return redirect('/')
    context = {'form': form}
    return render(request, 'ticket_form.html', context)

方案2:给Customer模型添加__str__方法(推荐)

在models.py的Customer类中定义__str__方法,让模型实例转为字符串时自动返回你需要的格式,再在视图中处理空值:

class Customer(models.Model):
    company_name = models.CharField(max_length=255, null=True)
    Customer_type = models.ManyToManyField(Customertype, blank=True)
    first_name = models.CharField(max_length=255, null=True)
    last_name = models.CharField(blank=True, max_length=255, null=True)
    
    def __str__(self):
        # 自定义客户信息的显示格式
        return f"{self.first_name} {self.last_name} ({self.company_name})"

随后修改views.py中的body部分:

body = {
    'customer': str(form.cleaned_data.get('customer')) if form.cleaned_data.get('customer') else '未指定客户',
    'subject': form.cleaned_data.get('subject'),
    'priority': form.cleaned_data.get('priority'),
    'details': form.cleaned_data.get('details'),
}

两种方案都能解决类型不匹配的问题,方案2还能让客户信息在Django admin等场景下也显示更友好,同时处理了customer为None的边界情况。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:20:32