Как создать динамическую форму настроек панели пользователя в Django 3.1?

Добрый день, застрял с formset, возможно это вообще не то, что мне нужно.

Мне необходимо создать динамическую форму настроек пользователя в его панели управления.
У меня есть 2 модели:
class Settings(models.Model):

    INPUT = 'TextInput'
    TEXTAREA = 'Textarea'

    WIDGET_CHOICES = [
        (INPUT, 'Input'),
        (TEXTAREA, 'Textarea')
    ]


    slug = models.CharField(max_length=60, unique=True, default=None)
    name = models.CharField(max_length=60)
    description = models.CharField(max_length=600)
    widget = models.CharField(max_length=10, choices=WIDGET_CHOICES, default=INPUT)
    
    class Meta:
        verbose_name = 'Настройки'
        verbose_name_plural = 'Настройки'


class UserSettings(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    setting = models.ForeignKey(Settings, on_delete=models.CASCADE)
    value = models.TextField()
    
    class Meta:
        verbose_name = 'Настройки пользователей'
        verbose_name_plural = 'Настройки пользователей'


Я хочу отобразить на странице /dashboard/settings для пользователя набор пар "имя опции" (не редактируется, тег label) + "значение опции" (редактируется, тег textarea), подставив в них существующие значения из модели UserSettings. Все должно выводиться в одной форме, чтобы внизу была одна кнопка "Сохранить".

При отправке формы в UserSettings должны сохраняться только те пары, где у опции значение не пустое, либо если опция уже существует в бд для пользователя и значение пустое, то ее нужно удалить.
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
Lda
@Lda Автор вопроса
Решил так:

class UserSettingsForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(UserSettingsForm, self).__init__(*args, **kwargs)

        settings_arr = Settings.objects.all()

        for setting in settings_arr:
            self.fields[setting.pk] = forms.CharField(
                required=True,
                widget=getattr(forms, setting.widget),
                label=setting.name, 
                help_text=setting.description
                )

    class Meta:
        model = Settings
        fields = [
            ]


Далее дело техники, правильно сохранить.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы