在 for 循环中在 django admin 中创建另一个模型对象

Posted

技术标签:

【中文标题】在 for 循环中在 django admin 中创建另一个模型对象【英文标题】:Create another model objects in django admin within a for loop 【发布时间】:2016-06-19 20:15:13 【问题描述】:

我对 django 完全陌生,以前是 php 编码器,所以如果我很笨,请多多包涵。 我在我的应用程序中定义了三个模型,理解、问题、答案。每个理解都有多个问题和答案,在 Comprehension 模型中定义为“内联”。问题由管理员直接输入,但答案会自动从理解中添加。 我想要实现的是,将理解拆分为句子,并将每个句子添加为带有当前理解外键的答案对象。 我正在尝试覆盖 Comprehension 模型中的保存方法。但是当我点击保存时,它给出了一个实例错误

Cannot assign "23L": "Answer.ComprehensionAnswer" must be a "Comprehension" instance.

我如何在这里分配/创建和实例?还是我采用了错误的方法。如果是这样,请指导我正确的方法。

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 模型的外键创建提交条件下的对象却一无所知。

【问题讨论】:

【参考方案1】:

您应该使用self 而不是self.pk,并注意self 指的是当前对象。

p = Answer.objects.create(AnswerText = sentence, ComprehensionAnswer = self)

从回溯中可以清楚地看出,Answer 模型的ComprehensionAnswer 属性需要Comprehension 模型的对象。但是您传递的是该对象的 id。

【讨论】:

哇,你拯救了我的一天@Avinash Raj。从早上开始,我一直在研究不同的方法,现在有了结果。非常感谢 之前是 php 编码器,我假设我必须提供主键才能存储在外键中。 django 提供了如此强大的功能来直接从对象获取 id,这很好。再次感谢。

以上是关于在 for 循环中在 django admin 中创建另一个模型对象的主要内容,如果未能解决你的问题,请参考以下文章

在 django admin 中链接到外键对象

在搜索字段中正确使用外键引用,Django admin

在循环中在python中传递多个参数

winform中在遍历子文件夹下,循环遍历子文件夹中的文件时提示该子文件夹没有访问权限!怎么解决?

如何在Django模板的内部for循环中使用外部for循环值

Django模板中的for循环