#python #django #django-models #django-views #django-templates
#python #django #django-модели #django-просмотры #django-шаблоны
Вопрос:
Я работаю над небольшим проектом django, и для этого я создал одну функциональность, которая позволяет пользователю создавать и затем присоединяться к группе.
Итак, вот в чем проблема :
всякий раз, когда я покидаю группу и пытаюсь присоединиться к ней, отображается ошибка, о которой я упоминал в вопросе
«Сбой УНИКАЛЬНОГО ограничения: groups_groupmember.group_id, groups_groupmember.user_id»
вот мой класс join :
class JoinGroup(LoginRequiredMixin, generic.RedirectView):
def get_redirect_url(self, *args, **kwargs):
return reverse('groups:single', kwargs={'slug': self.kwargs.get('slug')})
def get(self, request, *args, **kwargs):
group = get_object_or_404(Group, slug=self.kwargs.get('slug'))
from sqlite3 import IntegrityError
try:
# GroupMember.objects.create(group=group)
GroupMember.objects.create(user=self.request.user, group=group)
except IntegrityError:
messages.warning(self.request, 'already a member!')
else:
messages.success(self.request, 'You are now a member!')
return super().get(request, *args, **kwargs)
Вот мой models.py
from django.db import models
from django.utils.text import slugify
from django.urls import reverse
# Create your models here.
# GROUPS MODELS.PY
import markdown
from django.contrib.auth import get_user_model # returns user model that currently active in this project
User = get_user_model()
from django import template
register = template.Library()
class Group(models.Model):
name = models.CharField(max_length=256, unique=True)
slug = models.SlugField(allow_unicode=True, unique=True)
description = models.TextField(blank=True, default='')
description_html = models.TextField(editable=False, default='', blank=True)
members = models.ManyToManyField(User, through='GroupMember')
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
self.description_html = markdown.markdown(self.description)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse('groups:single', kwargs={'slug': self.slug})
class Meta:
ordering = ['name']
class GroupMember(models.Model):
group = models.ForeignKey(Group, related_name='memberships', on_delete=models.CASCADE)
user = models.ForeignKey(User, related_name='user_groups', on_delete=models.CASCADE)
def __str__(self):
return self.user.username
class Meta:
unique_together = ('group', 'user')
Не могли бы вы помочь мне решить эту проблему? Спасибо! 🙂
Комментарии:
1. можете ли вы предоставить models.py ?
Ответ №1:
Как насчет использования get_or_create
class JoinGroup(LoginRequiredMixin, generic.RedirectView):
def get_redirect_url(self, *args, **kwargs):
return reverse('groups:single', kwargs={'slug': self.kwargs.get('slug')})
def get(self, request, *args, **kwargs):
group = get_object_or_404(Group, slug=self.kwargs.get('slug'))
_, created = GroupMember.objects.create(user=request.user, group=group)
if not created:
messages.warning(request, 'already a member!')
else:
messages.success(request, 'You are now a member!')
return super().get(request, *args, **kwargs)
Комментарии:
1. но как насчет IntegrityError?
2. Используйте его, если вам нужно выполнить откат docs.djangoproject.com/en/3.1/topics/db/transactions /…