0

Error Image

When i'm trying to add Url of candidate_slug i'm getting an error about: Unknown field(s) (category_slug) specified for Candidate. Check fields/fieldsets/exclude attributes of class CandidateAdmin on add a candidate button and when i remove urls from admin i cannot add categories over my series and i'm unable to go to series after the category that shows on the homepage

urls.py

from django.urls import path, include
from . import views

app_name = 'main'

urlpatterns = [
    path("", views.homepage, name="homepage"),
    path("signup/", views.signup, name="signup"),
    path("login/", views.login_request, name="login"),
    path("logout", views.logout_request, name="logout"),
    path("profile/", views.profile, name="profile"),
    path("account/", views.account, name="account"),
    path("<single_slug>", views.single_slug, name="single_slug"),

]

views.py

from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import Candidate, CandidateCategory, CandidateSeries
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth import login, logout, authenticate
from django.contrib import messages
from .forms import NewUserForm


# Code for Showing(rendering) Homepage
def homepage(request):
    return render(request=request,
                  template_name="main/categories.html",
                  context={'categories': CandidateCategory.objects.all})


# Code for showing profiles section
def profile(request):
    return render(request,
                  "main/profile.html",
                  )


def single_slug(request, single_slug):
    categories = [c.category_slug for c in CandidateCategory.objects.all()]
    if single_slug in categories:
        matching_series = CandidateSeries.objects.filter(candidate_category__category_slug=single_slug)
        series_urls = {}

        for m in matching_series.all():
            part_one = Candidate.objects.filter(candidate_series__candidate_series=m.candidate_series).earliest("candidate_published")
            series_urls[m] = part_one.candidate_slug

        return render(request=request,
                      template_name='main/category.html',
                      context={"candidate_series": matching_series, "part_ones": series_urls})

    categories = [ca.candidate_slug for ca in Candidate.objects.all()]
    if single_slug in categories:
        this_candidate = Candidate.objects.get(candidate_slug=single_slug)
        candidates_from_series = Candidate.objects.filter(candidate_series__candidate_series=this_candidate.candidate_series).order_by('candidate_published')
        this_candidate_idx = list(candidates_from_series).index(this_candidate)

        return render(request,
                      "main/candidate.html",
                      {'candidates': this_candidate,
                       'sidebar': candidates_from_series,
                       'this_cat_idx': this_candidate_idx})


# Code for account
def account(request):
    return render(request,
                  "main/account.html",
                  )


# Code for Signing up for a new account
# this code also checks it the user already exists then it will throw the user already exists popup error message
def signup(request):
    if request.method == "POST":
        form = NewUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f"New account created: {username}")
            login(request, user)
            return redirect("main:homepage")
        else:
            for msg in form.error_messages:
                messages.error(request, f"{msg}: {form.error_messages[msg]}")

            return render(request,
                          "main/signup.html",
                          {'form': form})

    form = NewUserForm
    return render(request=request,
                  template_name="main/signup.html",
                  context={'form': form})


# Code for Logging in a user
# it also authenticates if this user is valid or invalid
def login_request(request):
    if request.method == "POST":
        form = AuthenticationForm(request=request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)
            if user is not None:
                login(request, user)
                messages.info(request, f"You are now Logged in as {username}")
                return redirect('/')
            else:
                messages.error(request, f"Invalid Username of Password")
        else:
            messages.error(request, f"Invalid Username of Password")

        return render(request,
                      "main/login.html",
                      {'form': form})

    form = AuthenticationForm
    return render(request,
                  "main/login.html",
                  {'form': form})


# This code is simply for logging out a user
def logout_request(request):
    logout(request)
    messages.info(request, f"User Logged out Successfully!!!")
    return redirect("main:homepage")

admin.py

from django.contrib import admin
from .models import Candidate, CandidateSeries, CandidateCategory
from django.db import models
from tinymce.widgets import TinyMCE


class CandidateAdmin(admin.ModelAdmin):
    fieldsets = [
        ("Title/date", {'fields': ["candidate_name", "candidate_published"]}),
        ("URL", {'fields': ["category_slug"]}),
        ("Series", {'fields': ["candidate_series"]}),
        ("Content", {'fields': ["candidate_content"]}),
    ]

    formfield_overrides = {
        models.TextField: {'widget': TinyMCE()},
        }


admin.site.register(CandidateSeries)
admin.site.register(CandidateCategory)
admin.site.register(Candidate, CandidateAdmin)

models.py

from django.db import models
from datetime import datetime


class CandidateCategory(models.Model):
    candidate_category = models.CharField(max_length=200)
    category_summary = models.CharField(max_length=200)
    category_slug = models.CharField(max_length=200, default=1)

    class Meta:
        verbose_name_plural = "Categories"

    def __str__(self):
        return self.candidate_category


class CandidateSeries(models.Model):
    candidate_series = models.CharField(max_length=200)
    candidate_category = models.ForeignKey(CandidateCategory, default=1, verbose_name="Category", on_delete=models.SET_DEFAULT)
    series_summary = models.CharField(max_length=200)

    class Meta:
        verbose_name_plural = "Series"

    def __str__(self):
        return self.candidate_series


class Candidate(models.Model):
    candidate_name = models.CharField(max_length=200)
    candidate_content = models.TextField()
    candidate_published = models.DateTimeField('date published', default=datetime.now())
    candidate_series = models.ForeignKey(CandidateSeries, default=1, verbose_name="Series", on_delete=models.SET_DEFAULT)
    candidate_slug = models.CharField(max_length=200, default=1)

    def __str__(self):
        return self.candidate_name
Yuki
  • 3,857
  • 5
  • 25
  • 43

1 Answers1

0

You have the following entry in CandidateAdmin.fieldsets

("URL", {'fields': ["category_slug"]}),

The Candidate model does not have a field category_slug, this is probably supposed to be

("URL", {'fields': ["candidate_slug"]}),
Iain Shelvington
  • 31,030
  • 3
  • 31
  • 50