Django. Как привязать пользователя к модели и реализовать добавление, редактирование и удаление данных через формы?

Всем привет. Делаю сайт агенства недвижимости. Мне нужно, чтобы это была закрытая система, т.е. без регистрации, админ добавит определённых риэлторов (пользователей) и всё. Ещё нужно, чтобы риэлтор мог на сайте добавлять своё объявление, редактировать, удалять.

Такой вопрос:

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

Заранее, спасибо ;)
  • Вопрос задан
  • 3219 просмотров
Решения вопроса 1
alternativshik
@alternativshik
Уберите из формы риэлтора, а во вью, после валидации формы вот так ее сохраняйте и тогда у листинга будет риэлтором текущий юзер, который создает данную запись

listing = form.save(commit=False)
listing.realtor = request.user
listing.save()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы