Когда пользователи выбирают категорию при создании группы, Django не отправляет ее в базу данных
Я пытаюсь создать модели категорий в моей базе данных и в то же время я хочу, чтобы пользователь в моем приложении мог выбрать категории, которые много их группы они создают. Я хочу, чтобы категории были также с картинками, но почему-то не могу понять, как это сделать. Ниже приведена модель
class Category(models.Model):
name = models.CharField(max_length=200, db_index=True)
image = models.ImageField(upload_to='category/%Y/%m/%d', blank=True)
class Meta:
ordering = ('name',)
verbose_name = 'category'
verbose_name_plural = 'categories'
def __str__(self):
return self.name
class GroupEx(models.Model):
categories = models.ForeignKey(Category, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name='groups')
admin = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="group_admin" )
cover = models.ImageField(upload_to='group_cover')
group_name = models.CharField(max_length=200, blank=True)
description = models.TextField(max_length=500, blank=True)
group_members = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name="members")
date_posted = models.DateTimeField(auto_now_add=True)
Вот мой вид функции для создания группы
def create_group(request):
context = {}
user = request.user
groups = GroupEx.objects.all()
friend_list = FriendList.objects.get(user=request.user)
friends = friend_list.friends.all()
if request.method == 'POST':
group_name = request.POST['group_name']
#category = request.FILES.get('category',False)
cover = request.FILES.get('cover',False)
group_name,created = Group.objects.get_or_create(name=group_name)
user_obj = Account.objects.get(username=request.user.username)
group_data = GroupEx(admin=user_obj,
group_name=group_name,
group=group_name,
cover=cover)
group_data.save()
return redirect('group:groups')
context['groups'] = groups
Вот HTML для создания групп, когда пользователи выбирают категорию, он не публикует ее в базе данных. Я не хочу, чтобы пользователи создавали свои собственные категории, вместо этого я предварительно создаю и прикрепляю изображения для идентификации групп, так что в основном я хочу, чтобы они просто выбрали категорию, к которой принадлежит их группа.
<div>
<label for="id_categories" class="font-semibold text-base"> Group Category </label>
<select id="id_categories" name="categories" class="shadow-none selectpicker with-border">
<option value="1">Technology</option>
<option value="2">Comedy</option>
<option value="4">Economics and Trade</option>
<option value="5">Education</option>
<option value="6">Entertainment</option>
<option value="7">Movies & Animation</option>
<option value="8">Gaming</option>
<option value="9">History and Facts</option>
<option value="10">Live Style</option>
<option value="0">Other</option>
</select>
</div>
Я наконец смог обойти эту проблему, сначала установив on_delete=models.SET_NULL, чтобы при удалении группы категория не удалялась вместе с удаленной группой, затем я добавил параметр null = True перед миграцией, чтобы сохранить изменения в базе данных, а затем я внес несколько изменений в представление для создания групп. Это позволило пользователям выбирать связанную категорию для создаваемой группы. Ниже представлено решение для моей модели.
class Gategory(models.Model):
name = models.CharField(max_length=200, db_index=True)
image = models.ImageField(upload_to='category/%Y/%m/%d', blank=True)
class Meta:
ordering = ('name',)
verbose_name = 'category'
verbose_name_plural = 'categories'
def __str__(self):
return self.name
class GroupEx(models.Model):
categories = models.ForeignKey(Gategory,on_delete=models.SET_NULL,null=True,related_name="category")
group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name='groups')
admin = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="group_admin" )
cover = models.ImageField(upload_to='group_cover')
group_name = models.CharField(max_length=200, blank=True)
description = models.TextField(max_length=500, blank=True)
group_members = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name="members")
date_posted = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.group_name
Вот мое решение для функционального представления для создания групп
def create_group(request):
context = {}
user = request.user
groups = GroupEx.objects.all()
friend_list = FriendList.objects.get(user=request.user)
friends = friend_list.friends.all()
if request.method == 'POST':
group_name = request.POST['group_name']
cover = request.FILES.get('cover',False)
categories = request.POST['categories']
categories,created = Gategory.objects.get_or_create(name=categories)
group_name,created = Group.objects.get_or_create(name=group_name)
user_obj = Account.objects.get(username=request.user.username)
group_data = GroupEx(admin=user_obj,
group_name=group_name,
group=group_name,
categories=categories,
cover=cover)
group_data.save()
return redirect('group:groups')