Как сделать связь между моделью и AbstractUser / AnonymousUser на основе аутентификации? - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь создать клон Pastebin , используя Django.В моем файле models.py у меня есть две модели:

  1. CustomUser, которая наследуется от AbstractUser
  2. Snippet, которая наследуется от Model
from .helpers import url_shortner
from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField(null=True, blank=True)

    def __str__(self):
        return self.username

class Snippet(models.Model):
    id = models.CharField(primary_key=True, max_length=19, default=url_shortner, editable=False)
    owner = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    title = models.CharField(max_length=50, default="Untitled")
    content = models.TextField()
    creation_date = models.DateTimeField(auto_now_add=True)
    expiration_date = models.DateTimeField(null=True, blank=True)

    def __str__(self):
        return self.title

Теперь, если есть гостевой пользователь, который хочет создать фрагмент, насколько я знаю, поле owner для этого фрагмента должно иметь отношение к объекту AnonymousUser, поэтому Какреализовать это? Есть ли какие-то отношения, которые могут связать Snippet объект с этими двумя моделями (CustomUser & GuestUser)?Какова лучшая практика для этого случая?

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Pastebin использует уникальный идентификатор пользователя для гостевых пользователей, чтобы они могли идентифицировать пользователя (без входа в систему).

see image

Когда гостевой пользователь впервые открывает свой веб-сайт, он сохраняет уникальный идентификатор пользователя в локальном хранилище браузера.после следующего запроса они идентифицируют гостевого пользователя по этому идентификатору.

В будущем Если пользователь войдет в систему, он выполнит поиск всего контента в базе данных по ИД пользователя и свяжется с логином ...

Чтобы сделать это ...

сначала сгенерироватьуникальный идентификатор ..

import uuid 

quest_id = uuid.uuid4()
  1. Отправьте этот guest_id в браузер, когда пользователь впервые заходит на ваш сайт.
  2. получите quest_id из браузера при каждом запросе для идентификации гостевого пользователя
  3. сохранить всю активность гостевого пользователя по guest_id в базе данных
  4. , если гостевой пользователь станет пользователем входа в систему, выполнить поиск всех данных по guest_id в базе данных и связать их с этим зарегистрированным пользователем
  5. Чтобы идентифицировать пользователяиспользуется в качестве гостя или логина ..
if request.user.is_authenticated:
   print('this is login user')

сделать поле владельца в вашей модели необязательным и добавить дополнительное поле guest_id

from .helpers import url_shortner
from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField(null=True, blank=True)

    def __str__(self):
        return self.username

class Snippet(models.Model):
    id = models.CharField(primary_key=True, max_length=19, default=url_shortner, editable=False)
    owner = models.ForeignKey(CustomUser, null=true, on_delete=models.CASCADE)
    title = models.CharField(max_length=50, default="Untitled")
    content = models.TextField()
    guest_id = models.CharField(max_length=100, blank=True)
    creation_date = models.DateTimeField(auto_now_add=True)
    expiration_date = models.DateTimeField(null=True, blank=True)

    def __str__(self):
        return self.title

, еслипользователь - гость, тогда ..

Snippet.objects.create(owner=None ,guest_id=guest_id .....)

получать guest_id из браузера при каждом запросе

Надеюсь, это поможет вам !!

0 голосов
/ 08 июня 2019

Вы можете сделать это с помощью:

1. Измените модели на:

`

from django.contrib.auth.models import User

class CustomUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField(null=True, blank=True)

    def __str__(self):
        return self.username

class Snippet(models.Model):
     id = models.CharField(primary_key=True, max_length=19, 
     default=url_shortner, editable=False)
     owner = models.ForeignKey(CustomUser, null=True,on_delete=models.CASCADE)
     title = models.CharField(max_length=50, default="Untitled")
     content = models.TextField()
     creation_date = models.DateTimeField(auto_now_add=True)
     expiration_date = models.DateTimeField(null=True, blank=True)

     def __str__(self):
         return self.title

`

2. Чтобы проверить в views.py, является ли пользователь гостем или нет, вы можете сделать это, используя:

if request.user.is_authenticated: pass

==> Этот тест возвращает false, если пользователь является GuestUser:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...