Django访问外键数据以设置字段默认值

2024-06-09 11:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同形式的模型。一个有外键链接到另一个,从这里我想设置一些字段默认数据。在

class Lexicon(models.Model):

    [...]

    case_sensitive = models.BooleanField(default=True)
    invariant = models.NullBooleanField(default=False)
    diacritics = models.BooleanField(default=True)

    [...]

    class Meta:
        verbose_name = "lexicon"
        ordering = ["filename"]

    def __str__(self):
        return self.filename


class Lexeme(models.Model):

    lexicon = models.ForeignKey(Lexicon, on_delete=models.CASCADE)

    case_sensitive = models.BooleanField(default=True)
    diacritics = models.BooleanField(default=True)

    [...]

    class Meta:
        verbose_name = "lexeme"

我希望Lexeme模型字段“区分大小写”和“音调符号”从Lexicon中默认。我想表格可能是个更好的地方。在

有什么想法吗?在


Tags: name模型truedefaultverbosemodelmodelsmeta
3条回答

据我所知,您只需要将数据从Lexicon填充到Lexeme模型字段。您可以在FormView中重写get_form_kwargs,如下所示

def get_form_kwargs(self):
    lex_obj = Lexeme.objects.get(pk=self.kwargs['pk'])
    kwargs = super().get_form_kwargs()
    kwargs['initial']['case_sensitive'] = lex_obj.lexicon.case_sensitive
    kwargs['initial']['diacritics'] = lex_obj.lexicon.diacritics
    return kwargs

这就是你想要的吗?我没有测试,但是,我在我的项目中使用了类似的东西。告诉我是否有效。在

使用Ajaxat template在词典发生变化时更改“区分大小写”和“音调符号”的初始值,抽象模型可用于减少重复行数:

class BaseLex(models.Model):
    case_sensitive = models.BooleanField(default=True)
    diacritics = models.BooleanField(default=True)

    class Meta:
        abstract = True

class Lexicon(BaseLex):
    # without `case_sensitive` and `diacritics' fields 
    ...

class Lexeme(BaseLex):
    # without `case_sensitive` and `diacritics' fields 
    lexicon = models.ForeignKey(Lexicon, on_delete=models.CASCADE)
    ...

我终于找到了出路。这只是场的基本初始设置,不需要触碰表单.py, 模型.py也不是html模板。 我像这样将数据传递到我的表单:

lexeme_form = LexemeForm(initial={'case_sensitive': lexicon.case_sensitive, 'diacritics': lexicon.diacritics})

相关问题 更多 >