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,且提交问卷后重定向到首页,这个变量不会被带到首页视图 - 没有从数据库统计用户实际完成的问卷数量,数值逻辑错误
修复方法
- 在你显示
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})
- 如果你是在问卷页面显示完成数量,直接把上述统计逻辑加到
question_one和question_two视图里即可,不要用临时累加的方式。
内容的提问来源于stack exchange,提问作者Kome Gognome
相关产品推荐
相关产品推荐

