在 for 循环中的 django admin 中创建另一个模型对象
Create another model objects in django admin within a for loop
我是 django 的新手,之前是 php 编码员,所以如果我很笨,请多多包涵。
我在我的应用程序中定义了三个模型,理解、问题、答案。每个理解都有多个问题和答案,在理解模型中定义为 'inline'。问题由管理员直接输入,但答案会根据理解自动添加。
我想要实现的是,将理解分解为句子,并将每个句子添加为具有当前理解外键的答案对象。
我正在尝试覆盖 Comprehension 模型中的保存方法。但是当我点击保存时,它给出了一个实例错误
Cannot assign "23L": "Answer.ComprehensionAnswer" must be a "Comprehension" instance.
如何 assign/create 和实例?还是我采用了错误的方法。如果是这样,请指导我采取正确的方法。
以下是models.py
的内容
class Question(models.Model):
QuestionText = models.CharField(max_length=500, verbose_name='Question Text')
QuestionTypeID = models.ManyToManyField(QuestionType, verbose_name='Question Type')
ComprehensionQuestion = models.ForeignKey(Comprehension, verbose_name='comprehension')
QuestionRemarks = models.CharField(max_length=500, verbose_name='remarks', null=True, blank=True)
LastUpdate = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.QuestionText
def was_published_recently(self):
return self.LastUpdate >= timezone.now() - datetime.timedelta(1)
class Answer(models.Model):
AnswerText = models.CharField(max_length=500, verbose_name='Answer Text')
AnswerTypeID = models.ManyToManyField(AnswerType, verbose_name='Answer Type')
ComprehensionAnswer = models.ForeignKey(Comprehension, verbose_name='Comprehension', null=True, blank=True)
AnswerRemarks = models.CharField(max_length=500, verbose_name='Remarks')
LastUpdate = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.AnswerText
class Comprehension(models.Model):
ComprehensionTitle = models.CharField(max_length=100, verbose_name='Comprehension Title')
ComprehensionsText = models.TextField(verbose_name='Text')
ComprehensionsRemarks = models.CharField(max_length=400, verbose_name='Remarks for this Comprehension', null=True, blank=True)
LastUpdate = models.DateTimeField("Last Updated", auto_now=True)
def __unicode__(self):
return self.ComprehensionTitle
def was_published_recently(self):
return self.LastUpdate >= timezone.now() - datetime.timedelta(1)
def save(self, *args, **kwargs):
#overrides the default save function to split the comprehension paragraph into sentences and adds them as probable answers
AnswerList = self.ComprehensionsText.split("u'\u0964'")
for sentence in AnswerList:
p = Answer.objects.create(AnswerText = sentence, ComprehensionAnswer = self.pk)
super(Comprehension, self).save(*args, **kwargs)
里面的内容admin.py
class ComprehensionAdmin(admin.ModelAdmin):
form = ComprehensionForm
fieldsets = [
('Main', {'fields': ['ComprehensionTitle','ComprehensionsText']}),
('Additional Info', {'fields': ['ComprehensionsRemarks'], 'classes': ['collapse']}),
]
inlines = [QuestionInline, AnswerInline]
list_display = ('ComprehensionTitle', 'LastUpdate')
list_per_page = 10
class QuestionInline(admin.TabularInline):
model = Question
extra = 2
class AnswerInline(admin.TabularInline):
model = Answer
extra = 2
admin.site.register(Question)
admin.site.register(Answer)
admin.site.register(Comprehension, ComprehensionAdmin)
我也遵循了page中提到的方法。但是,对于如何使用 Comprehension 模型的外键创建提交条件下的对象,空白。
您应该使用 self
而不是 self.pk
并注意 self
引用当前对象。
p = Answer.objects.create(AnswerText = sentence, ComprehensionAnswer = self)
从回溯中,它清楚地表明,Answer
模型的 ComprehensionAnswer
属性需要 Comprehension
模型的对象。但是您正在传递该对象的 ID。
我是 django 的新手,之前是 php 编码员,所以如果我很笨,请多多包涵。 我在我的应用程序中定义了三个模型,理解、问题、答案。每个理解都有多个问题和答案,在理解模型中定义为 'inline'。问题由管理员直接输入,但答案会根据理解自动添加。 我想要实现的是,将理解分解为句子,并将每个句子添加为具有当前理解外键的答案对象。 我正在尝试覆盖 Comprehension 模型中的保存方法。但是当我点击保存时,它给出了一个实例错误
Cannot assign "23L": "Answer.ComprehensionAnswer" must be a "Comprehension" instance.
如何 assign/create 和实例?还是我采用了错误的方法。如果是这样,请指导我采取正确的方法。
以下是models.py
的内容class Question(models.Model):
QuestionText = models.CharField(max_length=500, verbose_name='Question Text')
QuestionTypeID = models.ManyToManyField(QuestionType, verbose_name='Question Type')
ComprehensionQuestion = models.ForeignKey(Comprehension, verbose_name='comprehension')
QuestionRemarks = models.CharField(max_length=500, verbose_name='remarks', null=True, blank=True)
LastUpdate = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.QuestionText
def was_published_recently(self):
return self.LastUpdate >= timezone.now() - datetime.timedelta(1)
class Answer(models.Model):
AnswerText = models.CharField(max_length=500, verbose_name='Answer Text')
AnswerTypeID = models.ManyToManyField(AnswerType, verbose_name='Answer Type')
ComprehensionAnswer = models.ForeignKey(Comprehension, verbose_name='Comprehension', null=True, blank=True)
AnswerRemarks = models.CharField(max_length=500, verbose_name='Remarks')
LastUpdate = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.AnswerText
class Comprehension(models.Model):
ComprehensionTitle = models.CharField(max_length=100, verbose_name='Comprehension Title')
ComprehensionsText = models.TextField(verbose_name='Text')
ComprehensionsRemarks = models.CharField(max_length=400, verbose_name='Remarks for this Comprehension', null=True, blank=True)
LastUpdate = models.DateTimeField("Last Updated", auto_now=True)
def __unicode__(self):
return self.ComprehensionTitle
def was_published_recently(self):
return self.LastUpdate >= timezone.now() - datetime.timedelta(1)
def save(self, *args, **kwargs):
#overrides the default save function to split the comprehension paragraph into sentences and adds them as probable answers
AnswerList = self.ComprehensionsText.split("u'\u0964'")
for sentence in AnswerList:
p = Answer.objects.create(AnswerText = sentence, ComprehensionAnswer = self.pk)
super(Comprehension, self).save(*args, **kwargs)
里面的内容admin.py
class ComprehensionAdmin(admin.ModelAdmin):
form = ComprehensionForm
fieldsets = [
('Main', {'fields': ['ComprehensionTitle','ComprehensionsText']}),
('Additional Info', {'fields': ['ComprehensionsRemarks'], 'classes': ['collapse']}),
]
inlines = [QuestionInline, AnswerInline]
list_display = ('ComprehensionTitle', 'LastUpdate')
list_per_page = 10
class QuestionInline(admin.TabularInline):
model = Question
extra = 2
class AnswerInline(admin.TabularInline):
model = Answer
extra = 2
admin.site.register(Question)
admin.site.register(Answer)
admin.site.register(Comprehension, ComprehensionAdmin)
我也遵循了page中提到的方法。但是,对于如何使用 Comprehension 模型的外键创建提交条件下的对象,空白。
您应该使用 self
而不是 self.pk
并注意 self
引用当前对象。
p = Answer.objects.create(AnswerText = sentence, ComprehensionAnswer = self)
从回溯中,它清楚地表明,Answer
模型的 ComprehensionAnswer
属性需要 Comprehension
模型的对象。但是您正在传递该对象的 ID。