@msnyastar

Как изменить данные в уже существующей записи в БД?

Здравствуйте! Я в самом начале пути)
Никак не могу осилить правку уже существующей записи.
Django 3, PostgreSQL

Есть модель, связанная с пользователем через OneToOneField:
class ObjectsOfSurveillance(models.Model):

    """Параметры за которыми следит пользователь"""

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    btc = models.BooleanField(null=True, blank=True, default=False)
    eth = models.BooleanField(null=True, blank=True, default=False)
    xrp = models.BooleanField(null=True, blank=True, default=False)
    btcaddresses = models.ManyToManyField(BtcAddresses, verbose_name='Адреса')

    def __str__(self):
        return "Пользователь: {}, \t btc: {}, eth: {}, xrp: {}, Адреса: {}".format(self.user,
                                                                                   self.btc,
                                                                                   self.eth,
                                                                                   self.xrp,
                                                                                   self.btcaddresses)

    class Meta:
        verbose_name = 'Отслеживаемые параметры'
        verbose_name_plural = 'Списки отслеживаемых параметров'


от нее форма:
class ChangeSettingsForm(forms.ModelForm):
    """ Форма изменения пользовательских настроек"""
    class Meta:
        model = ObjectsOfSurveillance  # От какой модели будем строить форму
        fields = ('btc', 'eth', 'xrp')


и такое представление:
class UserSettingsViews(LoginRequiredMixin, View):

    """Отображение и наверное изменение пользовательских настроек оповещения """

    def post(self, request, pk):  # Запрос на правку

        settings_form = ChangeSettingsForm(request.POST, instance=request.user)

        if request.method == 'POST':  # Возможно не нужно

            if settings_form.is_valid():

                settings_form.save()
                messages.success(request, 'Настройки успешно обновлены!')

        return render(request, 'main/user_settings_pg.html', {'settings_form': settings_form})

    def get(self, request):  # Запрос на отображение

        settings_exist = get_object_or_404(ObjectsOfSurveillance, user_id=request.user.id)
        settings_form = ChangeSettingsForm(instance=settings_exist)

        return render(request, 'main/user_settings_pg.html', {'settings_form': settings_form})

В шаблоне:
<div  class="container">
        <h1  class="text-center">Заголовок</h1>
        <div  class="row justify-content-center">
            <div  class="col-4">
                <div class="card">
                    <div class="card-body">
                        <p>Правка пользовательских настроек:</p>
                        <form action="{% url 'u_s_v' user.id %}" method="post" enctype="multipart/form-data">

                            {% csrf_token %}

                            {{ settings_form|crispy }}

                            <button type="submit" class="btn btn-success">Save changes</button>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>


Ссылки:
urlpatterns = [
    path('', views.exlorer_search_form, name='exlorer_search_form'),
    path('user-settings/', views.UserSettingsViews.as_view(), name='UserSettingsViews'),
    path('user-settings/<int:pk>/', views.UserSettingsViews.as_view(), name='u_s_v'),
]


После того как кликаю "Save changes", запись в БД не меняется, а хотелось бы...
В чем может быть проблема?
  • Вопрос задан
  • 1296 просмотров
Решения вопроса 1
@msnyastar Автор вопроса
Разобраться помог Сергей Горностаев, решение выглядит так:

class UserSettingsViews(LoginRequiredMixin, View):

    """Отображение и наверное изменение пользовательских настроек оповещения """

    def post(self, request, pk):

        settings_exist = get_object_or_404(ObjectsOfSurveillance, user_id=pk)

        if request.method == 'POST':
            
            settings_form = ChangeSettingsForm(request.POST, instance=settings_exist)

            if settings_form.is_valid():

                settings_form.save()
                messages.success(request, 'Настройки успешно обновлены!')

        return render(request, 'main/user_settings_pg.html', {'settings_form': settings_form})

    def get(self, request):

        settings_exist = get_object_or_404(ObjectsOfSurveillance, user_id=request.user.id)
        settings_form = ChangeSettingsForm(instance=settings_exist)

        return render(request, 'main/user_settings_pg.html', {'settings_form': settings_form})
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы