Как разрешить пустой внешний ключ в Django? - PullRequest
2 голосов
/ 16 февраля 2020

Я очень новичок в Django, так что это может быть самый глупый вопрос. У меня есть две модели, созданные в Django; «Класс» и «Профиль».

Класс «Профиль» имеет внешний ключ, который ссылается на «Класс». При создании профиля в интерфейсе я не могу оставить форму пустой, поскольку («Profile.group» должен быть экземпляром «Class».). Я хочу иметь возможность создавать профиль, который не должен принадлежать классу.

class Class(models.Model):
    class_name = models.CharField(max_length=5)
    # a few other things that don't matter

    def __str__(self):
        return self.class_name

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # a few other things that don't matter
    group = models.ForeignKey(Class, on_delete=models.SET_NULL, null=True, blank=True)

и в form.py

class ProfileRegisterForm(forms.ModelForm):
    # a few other things
    group = forms.CharField(max_length=5, required=False)

Если есть что-то важное, что я пропустил, пожалуйста, дайте мне знать, я впервые публикую здесь, так что я не знаю, какой стандарт.

1 Ответ

2 голосов
/ 16 февраля 2020

Я хочу иметь возможность создать профиль, который не должен принадлежать классу.

Это уже так. Делая поле обнуляемым, вы можете просто передать ему None, и тогда оно не будет относиться ни к какому классу.

Однако group в вашей форме не должно быть CharField, но ModelChoiceField. То, как вы общаетесь с пользователем, определяется виджетом , который вы к нему прикрепляете. Например, вы можете использовать виджет , который реализует панель поиска, например, с django-select2 [Django -doc] или django-autocomplete-light [Django -doc] . django-autocomplete-lightweight позволяет извлекать записи через AJAX, уменьшая нагрузку на механизм рендеринга.

Например, мы можем установить django-select2 в виртуальной среде с:

pip install <b>django_select2</b>

Далее в ProfileRegisterForm мы можем указать виджет как:

from django_select2.forms import <b>Select2Widget</b>
from app.models import Class

class ProfileRegisterForm(forms.ModelForm):
    group = <b>forms.ModelChoiceField(</b>
        queryset=Class.objects.all(), <b>widget=Select2Widget</b>
    <b>)</b>

    class Meta:
        model = Profile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...