Заранее спасибо за чтение этого вопроса, и я надеюсь, что кто-то сможет мне помочь. Я только начал работать с Django пару недель назад, и я застрял с проблемой в течение некоторого времени. Цель приложения - создать страницу, на которой люди могут оставлять комментарии об объекте, в данном случае профессоре. Поэтому, когда я отправляю свою форму, мне нужно сохранить идентификатор профессора и идентификатор пользователя, чтобы затем отображать комментарии на соответствующих страницах. Сейчас я могу сохранить идентификатор пользователя, но не могу получить идентификатор профессора. Изучив несколько вопросов, я не смог найти решения, поэтому надеюсь, что у кого-то был опыт с аналогичной проблемой.
Я включил ошибку, но если нужен весь журнал, я с радостью предоставлю его. Я просто не хотел расширять пост больше, чем он есть. Я использую Django 2.2 и MySQL, вот код, который у меня есть.
forms.py
from django import forms
from .models import ProfessorRating
class CommentForm(forms.ModelForm):
class Meta:
model = ProfessorRating
fields = ('body', )
views.py
from .models import Professor
from .forms import CommentForm
from django.views.generic.edit import FormMixin
from django.urls import reverse
from django.views.generic import (
DetailView,
ListView,
)
# Create your views here.
class ProfessorListView(ListView):
model = Professor
paginate_by = 9
template_name = 'professors/professor_list.html'
class ProfessorDetailView(FormMixin, DetailView):
model = Professor
template_name = 'professors/professor_detail.html'
slug_url_kwarg = 'slug'
slug_field = 'slug'
paginate_by = 10
form_class = CommentForm
def get_success_url(self):
return reverse('professors:professor_detail', kwargs={'slug': self.object.slug})
def get_context_data(self, **kwargs):
context = super(ProfessorDetailView, self).get_context_data(**kwargs)
context['form'] = CommentForm(initial={'professor': self.object})
return context
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user
p = Professor.objects.get(id='prof_id')
form.instance.Professor = p
obj.save()
return super(ProfessorDetailView, self).form_valid(form)
else:
return self.form_invalid(form)
models.py
from __future__ import unicode_literals
from django.db.models.signals import pre_save
from django.db import models
from django.contrib.auth.models import User
from django.utils.text import slugify
from courses.models import Course
class Professor(models.Model):
prof_id = models.AutoField(db_column='prof_ID', primary_key=True) # Field name made lowercase.
first_name = models.CharField(max_length=25)
last_name = models.CharField(max_length=25)
title = models.CharField(max_length=30)
email = models.CharField(max_length=50)
phone_number = models.CharField(max_length=15)
office = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
picture = models.CharField(max_length=400)
courses = models.CharField(max_length=400)
def __str__(self):
return self.last_name
class Meta:
managed = True
ordering = ['last_name']
db_table = 'professor'
# THIS IS THE MODEL FOR THE COMMENTS/RATING
class ProfessorRating(models.Model):
rating_id = models.AutoField(db_column='rating_ID', primary_key=True) # Field name made lowercase.
user = models.ForeignKey(User, on_delete=models.CASCADE, db_column='username')
prof = models.ForeignKey(Professor, db_column='prof_ID', on_delete=models.CASCADE, related_name='comments') # Field name made lowercase.
body = models.TextField()
created = models.DateTimeField(auto_now_add=True)
approved = models.BooleanField(default=False)
def approved(self):
self.approved = True
self.save()
def __str__(self):
return self.body
class Meta:
managed = True
ordering = ['-rating_id']
db_table = 'prof_rating'
def create_slug(instance, new_slug=None):
slug = slugify(instance.first_name)
if new_slug is not None:
slug = new_slug
qs = Professor.objects.filter(slug=slug).order_by('last_name')
exists = qs.exists()
if exists:
new_slug = "%s-%s" % (slug, qs.first().prof_id)
return create_slug(instance, new_slug=new_slug)
return slug
def pre_save_course_receiver(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = create_slug(instance)
pre_save.connect(pre_save_course_receiver, sender=Course)
Error
Internal Server Error: /professors/Christopher-Antoun/
Traceback (most recent call last):
File "D:\School\Projects\iTerps\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "D:\School\Projects\iTerps\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "D:\School\Projects\iTerps\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\School\Projects\iTerps\lib\site-packages\django\views\generic\base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "D:\School\Projects\iTerps\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "D:\School\UMD\INST377\iTerps\professors\views.py", line 40, in post
p = Professor.objects.get(id='prof_id')
File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\query.py", line 399, in get
clone = self.filter(*args, **kwargs)
File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\query.py", line 892, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\query.py", line 910, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\sql\query.py", line 1290, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\sql\query.py", line 1318, in _add_q
split_subq=split_subq, simple_col=simple_col,
File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\sql\query.py", line 1190, in build_filter
lookups, parts, reffed_expression = self.solve_lookup_type(arg)
File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\sql\query.py", line 1049, in solve_lookup_type
_, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\sql\query.py", line 1420, in names_to_path
"Choices are: %s" % (name, ", ".join(available)))
django.core.exceptions.FieldError: Cannot resolve keyword 'id' into field. Choices are: comments, courseprof, courses, email, first_name, last_name, office, phone_number, picture, prof_id, slug, title