Как я могу настроить эти множественные 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 варианта:

  1. Измените "slug_field" на просто "slug".
  2. Переопределите поле slug в представлениях аккаунта, чтобы Django принимал их за поле slug, вот так:
slug_field = "slug_field"
slug_url_kwarg = "slug_field" 
Вернуться на верх