gpt4 book ai didi

python - Django:我需要将两个外键值传递到我的数据库以跟踪评论和用户

转载 作者:行者123 更新时间:2023-11-29 16:02:44 24 4
gpt4 key购买 nike

提前感谢您阅读这个问题,希望有人能够帮助我。几周前我刚刚开始使用 Django,现在我已经被一个问题困扰了一段时间。该应用程序的目的是提供一个页面,人们可以在其中发布有关某个对象(在本例中为教授)的评论。因此,当我提交表单时,我需要存储教授的 ID 和用户 ID,然后在各自的页面上显示评论。现在我可以存储用户 ID,但无法获取教授 ID。在查看了多个问题后,我一直无法找到解决方案,所以我希望有人有类似问题的经验。

我已经包含了错误,但如果需要整个日志,我很乐意提供。我只是不想将这篇文章扩展得更多。我正在使用 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)

错误


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



最佳答案

回溯清楚地显示了有问题的行:

p = Professor.objects.get(id='prof_id')

该行有两个问题。首先,你的 Professor 类没有 id 字段;它有一个 prof_id。其次,'prof_id' 是一个字符串;你需要一个实际值,即你想要获取的教授的 ID。

然而这整件事毫无意义。您已经拥有教授对象;它是self.object。您应该删除此查询并仅使用它。

    if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user
obj.prof = self.object
obj.save()

另请注意,您需要使用正确的字段名称;您的 ProfessorRating 对象有一个名为 prof,而不是 Professor

关于python - Django:我需要将两个外键值传递到我的数据库以跟踪评论和用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56035826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com