django. работа с User

332 просмотра
0
0 Комментариев

Привет ребята, начал изучать django. Прикрутил в проекте регистрацию, теперь хочу реализовать добавление статей и файлов от конкретного юзера, в итоге немного запутался в логике. Я должен создать модель и связать ее через ForeignKey с моделью User? я в правильном направлении мыслю? пока у меня это не выходит


Добавить комментарий

2 Answers

Python Опубликовано 14.12.2018
0

Можно, как вы и говорите, связывать свою модель пользователя с моделью django.contrib.auth.models.User через ForeignKey(django.contrib.auth.models.User), по этому способу можно найти много информации в интернете, особенно в англоязычном.

Также можно воспользоваться наследованием классов и унаследоваться от абстрактного класса django.contrib.auth.models.AbstractUser, в этом случае нужно будет в settings.py прописать путь к нашему классу пользователя AUTH_USER_MODEL = 'user.Profile' и указать бекэнд django.contrib.auth.backends.ModelBackend

Плюсы данного подхода:

  • Отсутствие необходимости создавать несколько таблиц
  • Избавление от лишней связи между таблицами (вытекает из первого)
  • Возможность использования стандартного механизма авторизации со своей моделью

Как это выглядит?

#user/model.py
 
from django.contrib.auth.models import AbstractUser, UserManager
from django.utils.translation import ugettext_lazy as _
from django.db import models
 
 
class Profile(AbstractUser):
    about_me = models.TextField(verbose_name=_('about me'), blank=True)
    avatar = models.ImageField(upload_to='avatars', verbose_name=_('avatar'), blank=True)
    ...
 
    objects = UserManager()
 
    class Meta:
        db_table = 'profiles'
        verbose_name = _('user profile')
        verbose_name_plural = _('user profiles')


#settings.py
 
....
 
AUTHENTICATION_BACKENDS = (
     'django.contrib.auth.backends.ModelBackend',
)
 
AUTH_USER_MODEL = 'user.Profile'
 
...

Что касается загрузки файлов, рекомендую попробовать решения из документации.

Думаю в вашем случае сработает вот так:

# views.py
def cabinet(request):
    if request.method == 'POST':
        form = ProfileForm(request.POST, request.FILES)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.profile_user = request.user
            obj.save()
            return redirect(reverse(cabinet))
    return render(request, 'cabinet.html', {'form': form})

При работе с файлами не забывайте указывать параметр enctype в теге формы.

<form method="post" enctype="multipart/form-data">

Добавить комментарий
0

я бы попробовал Вашу вью вот так:

def cabinet(request):
    user = UserProfile.objects.get(pk=request.user.pk)
    form = ProfileForm(request.POST or None, request.FILES,  instance=user)
    if request.method == 'POST' and form.is_valid():
        obj = form.save(commit=False)
        obj.profile_user = UserProfile.objects.get(pk=request.user.pk)
        obj.save()
        return redirect(reverse(cabinet))
    return render(request, 'cabinet.html', {'form': form})

Возможно несколько запутано, но у меня работает. Сам еще начинающий.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up