Как создать динамическую форму настроек панели пользователя в 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 должны сохраняться только те пары, где у опции значение не пустое, либо если опция уже существует в бд для пользователя и значение пустое, то ее нужно удалить.
  • Вопрос задан
  • 58 просмотров
Решения вопроса 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 = [
            ]


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

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

Войти через центр авторизации
Похожие вопросы
Junto Москва
от 80 000 до 120 000 ₽
Верфь Екатеринбург
от 70 000 до 140 000 ₽
Большая Тройка Москва
от 120 000 до 200 000 ₽