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

Django计算字段存库、跨应用传参及模板变量不显示问题咨询

1 模型计算字段存储问题

问题根源

  • 模型字段和方法重名,age字段和age()方法冲突,会覆盖方法逻辑
  • 字段名书写错误:计算年龄时调用了不存在的birthdate字段,实际模型字段为birthday
  • __str__方法缺少return语句
  • id_code()方法中直接拼接数字类型的年份,会触发类型错误
  • 没有把计算结果赋值给模型字段,保存时自然不会写入数据库
  • 自定义了id字段,和Django默认主键冲突,建议重命名为id_code

修复代码

accounts.models.py修改后:

import datetime
from django.db import models

class UserInformation(models.Model): 
    name = models.CharField(max_length=250)
    lastname = models.CharField(max_length=250)
    phone = models.CharField(max_length=250)
    birthday = models.DateField()
    age = models.CharField(max_length=2)
    # 把原来的id字段改名为id_code,避免和默认主键冲突
    id_code = models.CharField(max_length=250)   
 
    def __str__(self):
        return self.name + '_' + self.lastname + '_' + str(self.birthday.year)

    # 方法改名避免和字段重名
    def calculate_age(self):
       age = datetime.datetime.now().year - self.birthday.year
       return str(age)

    def generate_id_code(self):
        id_code = self.name + '_' + self.lastname + '_' + str(self.birthday.year)
        return id_code

    # 重写save方法,保存前自动赋值计算字段
    def save(self, *args, **kwargs):
        self.age = self.calculate_age()
        self.id_code = self.generate_id_code()
        super().save(*args, **kwargs)

修改完成后执行python manage.py makemigrations和python manage.py migrate同步数据库结构。


2 跨应用导入报错问题

问题根源

  • 导入逻辑错误:name是UserInformation模型的字段,不是独立可导入的变量,不能直接导入
  • 问卷模型没有关联用户表,__str__方法中调用不存在的self.name字段
  • QuestionTwoForm的关联模型写错,指向了QuestionOne

修复代码

question.models.py修改后:

from django.db import models
from django.contrib.auth import get_user_model
# 导入用户信息模型,不是导入字段
from accounts.models import UserInformation

User = get_user_model()
# 注意你代码里的point选项要提前定义,这里假设你已经定义好了
point = (('1', '1分'), ('2', '2分'), ('3', '3分'))

class QuestionOne(models.Model):
   # 增加用户外键关联
   user = models.ForeignKey(User, on_delete=models.CASCADE)
   question_1a = models.CharField(max_length=250, choices=point)
   question_2a = models.CharField(max_length=250, choices=point)
   question_3a = models.CharField(max_length=250, choices=point)
   id_code = models.CharField(max_length=250) 

   def __str__(self):
       # 通过外键获取用户姓名
       return self.user.username + '_question_1'

class QuestionTwo(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE)
   question_1b = models.CharField(max_length=250, choices=point)
   question_2b = models.CharField(max_length=250, choices=point)
   question_3b = models.CharField(max_length=250, choices=point)
   id_code = models.CharField(max_length=250) 

   def __str__(self):
       return self.user.username + '_question_2'

question.forms.py修改后:

from django import forms
from .models import QuestionOne, QuestionTwo

class QuestionOneForm(forms.ModelForm):
   class Meta:
       model = QuestionOne
       fields = ('question_1a', 'question_2a', 'question_3a')

class QuestionTwoForm(forms.ModelForm):
   class Meta:
       # 修正关联模型
       model = QuestionTwo
       fields = ('question_1b', 'question_2b', 'question_3b')

保存问卷时需要同时给id_code赋值,修改视图的保存逻辑:

# question.views.py 中保存问卷的部分
if form.is_valid():
    form.instance.user = request.user
    # 从用户信息表获取生成好的id_code
    form.instance.id_code = request.user.userinformation.id_code
    form.save()

3 前端模板变量显示问题

问题根源

  • 你当前的quest_done是视图内的临时变量,每次请求都会重置为0,且提交问卷后重定向到首页,这个变量不会被带到首页视图
  • 没有从数据库统计用户实际完成的问卷数量,数值逻辑错误

修复方法

  1. 在你显示quest_done的视图(一般是首页home对应的视图)里添加统计逻辑:
from question.models import QuestionOne, QuestionTwo

def home(request):
    # 其他逻辑省略
    if request.user.is_authenticated:
        # 统计当前用户已提交的两个问卷的总数
        count1 = QuestionOne.objects.filter(user=request.user).count()
        count2 = QuestionTwo.objects.filter(user=request.user).count()
        quest_done = count1 + count2
    else:
        quest_done = 0
    return render(request, 'home.html', {'quest_done': quest_done})
  1. 如果你是在问卷页面显示完成数量,直接把上述统计逻辑加到question_one和question_two视图里即可,不要用临时累加的方式。

内容的提问来源于stack exchange,提问作者Kome Gognome

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:18:02