Django Доступ к данным внешнего ключа для установки значения поля по умолчанию - PullRequest
0 голосов
/ 07 июня 2018

У меня есть две модели с соответствующими формами.У одного есть ссылка внешнего ключа на другой, и здесь я хотел бы установить некоторые данные по умолчанию для полей.

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 голосов
/ 07 июня 2018

Как я понимаю, вам нужно всего лишь заполнить данные от 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

Это то, что вы хотите?Я не проверял, но я использовал аналогичную вещь в моем проекте.Дайте мне знать, работает или нет.

0 голосов
/ 08 июня 2018

Я наконец нашел способ пойти.Это была просто базовая начальная настройка поля, не нужно прикасаться к forms.py, models.py или html-шаблону.Я передал данные в мою форму следующим образом:

lexeme_form = LexemeForm(initial={'case_sensitive': lexicon.case_sensitive, 'diacritics': lexicon.diacritics})
0 голосов
/ 07 июня 2018

используйте Ajax в шаблоне, чтобы изменить начальное значение "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)
    ...
...