Всем привет. Делаю сайт агенства недвижимости. Мне нужно, чтобы это была закрытая система, т.е. без регистрации, админ добавит определённых риэлторов (пользователей) и всё. Ещё нужно, чтобы риэлтор мог на сайте добавлять своё объявление, редактировать, удалять.
Такой вопрос:
1) Как правильно создать таблицу Объявления, чтобы она была привязана к пользователю, т.е. чтобы, при добавлении объявления риэлтор не выбирал пользователя из выпадающего списка, если это было сделано через ForeignKey, а как-то по-другому, чтобы объявление автоматически привязывалось к пользователю;
2) Как потом правильно создать форму, чтобы можно было выполнять CRUD операции.
Делал по видео уроку, но в нём, конечно, многое не понял.
Вот моя модель на данный момент:
from django.db import models
from datetime import datetime
from django.contrib.auth.models import User
class Listing(models.Model):
realtor = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Риэлтор')
realtor_photo = models.ImageField(blank=True, upload_to='photos/%Y/%m/%d/', verbose_name='Фото риэлтора')
region = models.CharField(default="Чуйская", max_length=100, verbose_name='Область')
city = models.CharField(default="Бишкек", max_length=100, verbose_name='Город')
district = models.CharField(max_length=100, verbose_name='Район')
title = models.CharField(max_length=200, verbose_name='Заголовок')
address = models.CharField(max_length=200, verbose_name='Адрес')
description = models.TextField(blank=True, verbose_name='Описание')
stage = models.IntegerField(verbose_name='Этаж')
rooms = models.IntegerField(verbose_name='Количество комнат')
garage = models.IntegerField(default=0, verbose_name='Гараж')
sqmt = models.IntegerField(verbose_name='Площадь')
price = models.IntegerField(verbose_name='Цена')
photo_main = models.ImageField(upload_to='photos/%Y/%m/%d/', 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 Meta:
verbose_name = 'Объявление'
verbose_name_plural = 'Объявления'
Вот файл forms.py
from django import forms
from .models import Listing
class ListingForm(forms.ModelForm):
class Meta:
model = Listing
fields = ('realtor', 'realtor_photo', 'region', 'city', 'district', 'title', 'address',
'description', 'stage', 'rooms', 'garage', 'sqmt', 'price', 'photo_main', 'photo_1',
'photo_1', 'photo_2', 'photo_3', 'photo_4','photo_5',)
Вот представление, я знаю, что пока не будет ничего сохранятся в бд, ибо пока не знаю как это сделать, пробовал разными способами, но пока не получилось.
def listing_add(request):
form = ListingForm()
return render(request, 'listings/listing_add.html', {'form': form})
Вход реализован так:
{% extends 'base.html' %}
{% block title %} | Вход {% endblock %}
{% block content %}
<section id="login" class="bg-light py-5">
<div class="container">
<div class="row">
<div class="col-md-6 mx-auto">
<div class="card">
<div class="card-header bg-primary text-white">
<h4>
<i class="fas fa-sign-in-alt"></i> Войти</h4>
</div>
<div class="card-body">
<!-- Alerts -->
{% include 'partials/_alerts.html' %}
<form action="{% url 'login' %}" method="POST">
{% csrf_token %}
<div class="form-group">
<label for="username">Имя пользователя</label>
<input type="text" name="username" class="form-control" required>
</div>
<div class="form-group">
<label for="password2">Пароль</label>
<input type="password" name="password" class="form-control" required>
</div>
<input type="submit" value="Войти" class="btn btn-secondary btn-block">
</form>
</div>
</div>
</div>
</div>
</div>
</section>
{% endblock %}
Функция представления:
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username=username, password=password)
if user is not None:
auth.login(request, user)
messages.success(request, 'Вы вошли в систему')
return redirect('dashboard')
else:
messages.error(request, 'Введены неверные данные')
return redirect('login')
else:
return render(request, 'accounts/login.html')
Заранее, спасибо ;)