Создание формы Django, которая позволяет редактировать «дополнительные поля» в «сквозной» таблице - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть User, SocialNetwork и UserSocialNetwork модели в проекте Django 3.0.3.

class User(AbstractUser):
    email = models.EmailField(
      verbose_name='email address',
      max_length=255,
      unique=True,
    )
    middle_name = models.CharField(blank=True, max_length=255, unique=False)
    bio = models.TextField(blank=True, default='')

…

    socialnetworks = models.ManyToManyField(SocialNetwork, through='UserSocialNetwork')
    updated_at = models.DateTimeField(auto_now=True)


class SocialNetwork(models.Model):
    name = models.CharField(blank=False, max_length=255)
    description = models.TextField(blank=True, default='')
    url = models.URLField(blank=False, max_length=255)
    format = models.CharField(blank=False, max_length=8, choices=[('handle', 'handle'), ('url', 'url')])
    base_url = models.URLField(blank=True, max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name


class UserSocialNetwork(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    socialnetwork = models.ForeignKey(SocialNetwork, on_delete=models.CASCADE)
    identifier = models.CharField(blank=False, max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['socialnetwork', ]
        verbose_name = "User's Social Network"

Я использую django -formtools для создания профиля. Одним из шагов должна быть страница, на которой создателю профиля предоставляется список соцсетей и предоставляется возможность ввести свои identifier в этих сетях. Я боролся с этим.

Было предложено использовать формы, и у меня есть это

class UserSocialNetworkForm(BaseModelForm):
    class Meta:
        model = UserSocialNetwork
        fields = [
            'socialnetwork',
            'identifier',
        ]
        labels = {
            'socialnetwork': _('Social Network'),
        }


UserSocialNetworkFormSet = formset_factory(UserSocialNetworkForm, extra=SocialNetwork.objects.count())

, которое дает

enter image description here

но все, что я действительно хочу, - это одна строка в социальной сети. Нет раскрывающегося списка для сети, только имя сети, которое отображается как <label> для сопровождающего <input>.

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