我正在研究Django教程。
在民意调查应用程序管理页面中,我想根据民意调查问题的第一个字符创建list_filter
。
为了解决这个问题,我考虑在问题模型中添加一个字段,该字段将问题文本的第一个字符作为值。但是,我希望自动设置该字段的值。我尝试了几种方法,但我无法理解一些事情:
教程中的代码:
class Question(models.Model):
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
我尝试添加另一个字段:
first_char = question_text[:1]
我收到了错误:
'CharField'对象不可订阅
我想我无法在模型类中添加正常值。为什么我会收到此错误,即使question_text
是字符串?
我尝试覆盖__init__
,但即使没有错误,也没有填充数据库:
def __init__(self,*args,**kwargs):
super(Question, self).__init__(*args, **kwargs)
self.first_char = self.question_text[:1]
first_char = models.CharField(max_length=1)
如何实现这一目标?
Django:1.7
Ubuntu:14.04
答案 0 :(得分:0)
我认为你不应该在数据库中添加字段,只是为了在管理员中制作漂亮的过滤器。
无论如何,您的问题是您没有将first_char分配给对象的值,而是分配给CharField,这不是可订阅的,就像错误告诉您的那样。我建议通过教程和学习,更多,但这里是你的问题的答案。
覆盖save()方法,并在那里添加字段:
class Question(models.Model):
...
first_char = models.CharField(max_length=1)
def save(self):
# self.first_char for referencing to the current object
self.first_char = self.question_text[1]
super().save(self)
现在,每当保存对象时,first_char将被设置为question_text的第一个字符。