Джанго. Добавить, редактировать и удалять на Django - PullRequest
1 голос
/ 12 марта 2019

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

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})

Я понимаю, что перечисление .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

1 Ответ

0 голосов
/ 12 марта 2019

В соответствии с логикой вашей базы данных, вы должны установить 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
...