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

时间:2018-06-07 09:32:02

标签: python django django-models foreign-keys

我有两个模型及其各自的表格。一个有一个外键链接到另一个,从这里我想设置一些字段默认数据。

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模型字段“case_sensitive”和“diacritics”默认来自Lexicon。我认为表格可能是一个更好的地方。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我终于找到了要走的路。它只是字段的基本初始设置,无需触及forms.py,models.py和html模板。 我将数据传递给我的表单:

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

答案 2 :(得分:-1)

在模板中使用 Ajax 来更改Lexicon更改时“case_sensitive”和“diacritics”的初始值,并且可以使用抽象模型来减少重复行:

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)
    ...