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