django - 姜戈。在 django 上添加、编辑和删除
问题描述
请告诉我,添加,编辑和删除列表的功能是什么样的?一、如何在这个函数中正确注册当前用户?其次,如何保证只有当前用户可以删除和编辑列表?目前,任何人都可以做到这一点,甚至是未注册的用户。
def listing_delete(request, listing_id):
listing = Listing.objects.get(id=listing_id)
listing.delete()
return redirect('index')
def listing_edit(request, listing_id):
form = ListingForm(instance = Listing.objects.get(id = listing_id))
if request.method == "POST":
form = ListingForm(request.POST, request.FILES, instance = Listing.objects.get(id = listing_id))
if form.is_valid():
listing = form.save()
return redirect('listing', listing_id)
else:
ListingForm(instance=Listing.objects.get(id = listing_id))
return render(request, 'listings/listing_edit.html', {'form': form})
def listing_add(request):
form = ListingForm()
if request.method == "POST":
form = ListingForm(request.POST, request.FILES)
if form.is_valid():
listing = form.save(commit=False)
listing.realtor = request.user
listing.save()
return redirect('dashboard')
return render(request, 'listings/listing_add.html', {'form': form})
我知道listing.realtor = request.user 是错误的,因为必须有一个房地产经纪人的实例,但我不明白如何正确地做到这一点。
class Listing(models.Model):
realtor = models.ForeignKey(Realtor, on_delete=models.CASCADE, verbose_name='Риэлтор')
region = models.CharField(default="Чуйская", max_length=100, verbose_name='Область')
city = models.CharField(default="Бишкек", max_length=100, verbose_name='Город')
district = models.CharField(blank=True, max_length=100, verbose_name='Район')
title = models.CharField(max_length=200, verbose_name='Заголовок')
address = models.CharField(blank=True, max_length=200, verbose_name='Адрес')
description = models.TextField(blank=True, verbose_name='Описание')
stage = models.IntegerField(blank=True, verbose_name='Этажность')
rooms = models.IntegerField(blank=True, verbose_name='Количество комнат')
garage = models.IntegerField(default=0, blank=True, verbose_name='Гараж')
sqmt = models.IntegerField(blank=True, verbose_name='Площадь')
price = models.IntegerField(blank=True, verbose_name='Цена')
photo_main = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Основное фото')
photo_1 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 1')
photo_2 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 2')
photo_3 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 3')
photo_4 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 4')
photo_5 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 5')
photo_6 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 6')
is_published = models.BooleanField(default=True, verbose_name='Публично')
list_date = models.DateTimeField(default=datetime.now, blank=True, verbose_name='Дата публикации')
def __str__(self):
return self.title
class Realtor(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='Пользователь', related_name='realtor')
photo = models.ImageField(upload_to='photos/%Y/%m/%d/', verbose_name='Фото')
description = models.TextField(blank=True, verbose_name='Описание')
phone = models.CharField(max_length=20, verbose_name='Телефон')
is_mvp = models.BooleanField(default=False, verbose_name='Реэлтор месяца')
hire_date = models.DateTimeField(default=datetime.now, blank=True, verbose_name='Дата приёма на работу')
def __str__(self):
return self.description
解决方案
根据您的数据库逻辑,您应该设置request.user
为listing.realtor.user
def listing_add(request):
form = ListingForm()
if request.method == "POST":
form = ListingForm(request.POST, request.FILES)
if form.is_valid():
listing = form.save(commit=False)
listing.realtor.user = request.user //here
listing.save()
return redirect('dashboard')
return render(request, 'listings/listing_add.html', {'form': form})
对于第二个问题,您可以使用@login_required
装饰器来让唯一登录的用户进行编辑、删除和添加。
from django.contrib.auth.decorators import login_required
@login_required
def method_name():
#Logic
推荐阅读
- python - 在这个 Python 示例中,为什么一个变量会影响另一个变量?
- docker - 将非空 docker 容器目录暴露给主机
- python - Python数据框排序值选择n个第一个结果
- c++ - 如何使用 Qt 类和函数构建 XML 文件并转义所有非 Unicode 字符?
- r - 在 R 中创建一个新数据框,其中包含另一个数据框的统计信息
- javascript - Webpack 打包 ReactDOM 导致 loader 错误
- powershell - 如何将项目添加到函数中的数组作为Powershell上的脚本变量?
- android - PendingIntent.FLAG_UPDATE_CURRENT 重新创建活动
- r - 基于R中条件颜色的螺旋(极地)图?
- c# - 如何使用三层架构创建搜索