Как я могу настроить эти множественные slugs в моих урлах и представлениях: Django
Я пытался настроить мои url и представления для этого приложения для защиты паролей
- На сайте может быть много аккаунтов, и для редактирования аккаунта я планирую использовать такой конфиг url: home/[имя сайта]/[имя учетной записи]/edit/. но он приносит ошибки. Как мне поступить?
Мой views.py:
class SiteDetailView(DetailView):
model = Site
template_name = "site_detail.html"
class SiteDeleteView(DeleteView):
model = Site
template_name = "site_delete.html"
success_url = reverse_lazy("home")
class SiteEditView(UpdateView):
model = Site
template_name = "site_edit.html"
fields = ("siteName",)
class AccountDeleteView(DeleteView):
model = Account
template_name = "account_delete.html"
# def get_success_url(self):
# return reverse_lazy("site_detail", kwargs={"slug": self.object.slug})
class AccountEditView(UpdateView):
model = Account
template_name = "account_edit.html"
fields = (
"username",
"password",
)
my urls.py:
from django.urls import path
from .views import (
IndexView,
HomePageView,
SiteDetailView,
SiteDeleteView,
AccountDeleteView,
AccountEditView,
SiteEditView,
)
urlpatterns = [
path("home/<slug:slug>/edit/", SiteEditView.as_view(), name="site_edit"),
path(
"home/<slug:slug>/<slug:slug_field>/edit/",
AccountEditView.as_view(),
name="account_edit",
),
path(
"home/<slug:slug>/<slug:slug_field>/delete/",
AccountDeleteView.as_view(),
name="account_delete",
),
path("home/<slug:slug>/delete/", SiteDeleteView.as_view(), name="site_delete"),
path("home/<slug:slug>/", SiteDetailView.as_view(), name="site_detail"),
path("home", HomePageView.as_view(), name="home"),
path("", IndexView.as_view(), name="index"),
]
мои модели:
from django.db import models
from django.urls import reverse
from django.conf import settings
from django.template.defaultfilters import slugify
class Site(models.Model):
siteName = models.CharField(max_length=200)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
slug = models.SlugField(null=False, unique=True)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.siteName
def get_absolute_url(self):
return reverse("site_detail", kwargs={"slug": self.slug})
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.siteName)
return super().save(*args, **kwargs)
class Account(models.Model):
site_name = models.ForeignKey(Site, on_delete=models.CASCADE)
username = models.CharField(max_length=140)
password = models.CharField(max_length=50)
slug_field = models.SlugField(null=False, unique=True)
def __str__(self):
return self.username
def get_absolute_url(self):
return reverse("home")
def save(self, *args, **kwargs):
if not self.slug_field:
self.slug_field = slugify(self.username)
return super().save(*args, **kwargs)
my site_detail.html:
{% extends 'base.html' %}
{% block content %}
<h2>{{ object.siteName }}</h2>
<hr>
{% for username in object.account_set.all %}
<p>Username: {{ username.username }}</p>
<p>Password: {{ username.password }}</p>
<p><a href="{% url 'account_edit' object.slug username.slug_field %}"><button type="button">Edit account</button></a>
<a href="#"><button type="button">Delete account</button></a></p>
<hr>
{% endfor %}
<p><a href="{% url 'site_delete' object.slug %}"><button type="button">Delete site</button></a>
<a href="{% url 'site_edit' object.slug %}"><button type="button">Edit site</button></a></p>
{% endblock content %}
текущая ошибка, с которой я сталкиваюсь:
raise FieldError(
django.core.exceptions.FieldError: Cannot resolve keyword 'site' into field. Choices are: id, password, site_name, site_name_id, slug_field, username
вот как выглядит детальное представление на url http://127.0.0.1:8000/home/redditcom/ вот как детальное представление выглядит на url http://127.0.0.1:8000/home/redditcom/
Вы используете siteName
в модели Site
и site_name
в модели Account
. Я не уверен, какой код генерирует ошибку, поскольку я не вижу ничего, ссылающегося только на site
в том, что вы здесь разместили, но если вы посмотрите на ошибку, вы можете увидеть из других перечисленных полей, что она ссылается на модель Account
. Поэтому вам нужно заменить site
на site_name
где-нибудь.
Для меня, когда я делаю такие вещи, вы используете уникальный slug. Вы можете добавить случайный уникальный номер к slug, сгенерировав его из uuid4, и с помощью цикла while убедиться, что ни один slug не повторяется .
Просто создайте файл util.py в вашем приложении и напишите функцию для генерации случайного уникального числа и добавьте его к вашему slug в models
Чтобы Django четко обрабатывал slug, имя поля должно быть названо как "slug", поэтому для вашей модели Site проблем не будет, но для модели счета вы назвали его "slug_field", тогда у вас есть 2 варианта:
- Измените "slug_field" на просто "slug".
- Переопределите поле slug в представлениях аккаунта, чтобы Django принимал их за поле slug, вот так:
slug_field = "slug_field"
slug_url_kwarg = "slug_field"