Задать вопрос
@nurzhannogerbek

Редактирование пользовательских данных | Django?

Здравствуйте! Помогите пожалуйста разобраться.

Есть модель данных Profile, в которой на данный момент есть лишь два поля. Поясню, что поле idx нужно лишь для сортировки записей. В моем приложении пользователь может перетаскивать записи в списке и тем самым сортировать их. Само поле пользователем не видно и оно не редактируется в ручную пользователями. То есть вывожу список профилей. Далее по id профиля получаю данные для редактирования.

Пытаюсь создать форму редактирования пользовательских данных. Сами данные вывожу в форму, но вот сохранить их не удается. Внизу вывел детальный log по ошибке. Уверен, что есть более изящное решение данной задачи. Буду рад услышать и обсудить их.

models.py:
# -*- coding: utf-8 -*-

from django.db import models
from django.contrib.auth.models import User
from django.dispatch import receiver
from django.db.models.signals import post_save, post_delete

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    idx = models.IntegerField(verbose_name='Поле для сортировки', default=0, blank=True,)

    class Meta:
        ordering = ['idx', 'pk']
        db_table = 'user_profile'


@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save()

@receiver(post_delete, sender=Profile)
def delete_user(sender, instance=None, **kwargs):
    try:
        instance.user
    except User.DoesNotExist:
        pass
    else:
        instance.user.delete()


forms.py:
from django import forms
from django.contrib.auth.models import User

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = '__all__'


views.py:
class UserEditView(UpdateView):
    template_name = 'users/edit_user.html'
    form_class = UserForm
    model = User

    def get(self, request, *args, **kwargs):
        data = dict()
        profile = Profile.objects.get(pk=self.kwargs['pk'])
        user_edit_form = UserForm(instance=profile.user)
        context = {
            'profile': profile,
            'user_edit_form': user_edit_form
        }
        data['html_user_edit_form'] = render_to_string(
            'users/edit_user.html', context, request=request
        )
        return JsonResponse(data)

    def form_valid(self, form):
        form.save()
        data = dict()
        data['form_is_valid'] = True
        context = {'users': User.objects.all()}
        data['html_users'] = render_to_string('users/users.html', context)
        return JsonResponse(data)


ERROR:
LevelName: WARNING | Module: base | Process: 662 | Thread: 123145371320320 | Message: Not Found: /user/31/edit/
LevelName: WARNING | Module: basehttp | Process: 662 | Thread: 123145371320320 | Message: "POST /user/31/edit/ HTTP/1.1" 404 1800
  • Вопрос задан
  • 1629 просмотров
Подписаться 1 Простой 7 комментариев
Решения вопроса 1
@nurzhannogerbek Автор вопроса
Пользователь Pavel Denisov указал мне на мою ошибку. Хоть я и получаю id профиля мне далее нужно было всего лишь передать в шаблон id пользователя данного профиля.

В шаблон передал пользователя context = {'user': profile.user,}, затем уже в шаблоне указал id пользователя.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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