Назначение права собственности в Django для изменения или удаления записей

Первый пост здесь. Я следовал коду проекта в книге Python Crash Course, так что если код выглядит похожим, то это именно поэтому.

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

urls.py

"""Defines URL patterns for research_topic_database."""
# research_topic_database

from django.urls import path

from . import views

app_name = 'research_topic_database'
urlpatterns = [
    # Home page
    path('', views.index, name='index'),
    # Page that shows all the research category topics.
    path('topics/', views.topics, name='topics'),
    # Detail page for a single research entry submission.
    path('topics/<int:topic_id>/', views.topic, name='topic'),
    # Page for adding a new research entry submission.
    path('new_entry/<int:topic_id>/', views.new_entry, name='new_entry'),
    # Page for editing an entry.
    path('edit_entry/<int:entry_id>/', views.edit_entry, name='edit_entry'),
]

models.py

class Topic(models.Model):
"""A research category for topic submissions to fall under."""
category = models.CharField(max_length=19, choices=CATEGORY_CHOICES, blank=True)
date_added = models.DateTimeField(auto_now_add=True)

def __str__(self):
    """Return a string representation of the model."""
    return self.category

class Entry(models.Model):
"""Entry information about a research topic."""
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
classification = models.CharField(max_length=10, choices=CLASSIFICTION_CHOICES, blank=True)
# The research_title identifies the entry in the database.
research_title = models.CharField(max_length=200)
research_topic_description = models.CharField(max_length=200)
# Explain the USMC requirements you want the research to fulfill.
extended_topic_description = models.TextField()
desired_objectives = models.TextField()
sponsor = models.CharField(max_length=100)
point_of_contact = models.CharField(max_length=100)
mailing_address = models.CharField(max_length=200)
email_address = models.CharField(max_length=50)
phone = models.CharField(max_length=12)
fax = models.CharField(max_length=12)
desired_completion_date = models.CharField(max_length=12)
available_funding = models.CharField(max_length=50)
comments = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)

# connecting research entries to certain Users.
owner = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
# owner = models.ForeignKey(User, on_delete=models.CASCADE)
# owner = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)

class Meta:
    verbose_name_plural = 'entries'

def __str__(self):
    """Return a string representation of the model."""
    return f"{self.research_title[:100]}..."

views.py

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.http import Http404

from .models import Topic, Entry
from .forms import EntryForm

def index(request):
"""The home page for research_topic_database."""
return render(request, 'research_topic_database/index.html')

@login_required
def topics(request):
"""Show all research categories from TOPIC class."""
topics = Topic.objects.order_by('date_added')
context = {'topics': topics}
return render(request, 'research_topic_database/topics.html', context)

@login_required
def topic(request, topic_id):
"""Show a single research category from TOPIC class
and all its submission entries."""
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'research_topic_database/topic.html', context)

@login_required
def new_entry(request, topic_id):
"""Add a new entry submission under a research category."""
topic = Topic.objects.get(id=topic_id)

if request.method != 'POST':
    # No data submitted; create a blank form.
    form = EntryForm()
else:
    # POST data submitted; process data.
    form = EntryForm(data=request.POST)
    if form.is_valid():
        new_entry = form.save(commit=False)
        new_entry.topic = topic
        new_entry.save()
        return redirect('research_topic_database:topic', topic_id=topic_id)

# Display a blank or invalid form
context = {'topic': topic, 'form': form}
return render(request, 'research_topic_database/new_entry.html', context)

@login_required
def edit_entry(request, entry_id):
"""Edit an existing research entry submission."""
entry = Entry.objects.get(id=entry_id)
topic = entry.topic

if request.method != 'POST':
    # Initial request, pre-fill form with current entry.
    form = EntryForm(instance=entry)
else:
    # POST data submitted; process data.
    form = EntryForm(instance=entry, data=request.POST)
    if form.is_valid():
        form.save()
        return redirect('research_topic_database:topic', topic_id=topic.id)

context = {'entry': entry, 'topic': topic, 'form': form}
return render(request, 'research_topic_database/edit_entry.html', context)
Вернуться на верх