首页 > 解决方案 > Django:我需要将两个外键值传递给我的数据库以跟踪评论和用户

问题描述

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

我已经包含了错误,但如果需要整个日志,我很乐意提供。我只是不想将帖子扩展得比现有的更多。我正在使用 Django 2.2 和 MySQL,这是我到目前为止的代码。

表格.py

from django import forms
from .models import ProfessorRating


class CommentForm(forms.ModelForm):
    class Meta:
        model = ProfessorRating
        fields = ('body', )

视图.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)

模型.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



标签: pythonmysqldjango

解决方案


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

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

这条线有两个问题。首先,您的教授类没有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


推荐阅读