我有两个模型及其各自的表格。一个有一个外键链接到另一个,从这里我想设置一些字段默认数据。
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。我认为表格可能是一个更好的地方。
有什么想法吗?
答案 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)
...