'FieldError at /answer/ Cannot resolve keyword 'i' into field. Choices are: add_time, answer, detail, id,
believe it or not I've been here for 4 hours trying to get this to work, so yes, I've been trying to make a question and answer site, currently trying to make an answer form so I can send in answers to the question that I am currently viewing, trying to get the id of the question so I can attach the answer into that, but I'm getting this error, I'm sure I wrote 'id' but it thinks I wrote 'i'... What? Anyway here is the traceback, please tell me what I am doing wrong, thanks.
Traceback:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/answer/
Django Version: 4.0.4
Python Version: 3.8.10
Installed Applications:
['django.contrib.humanize',
'forum',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'crispy_forms',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users',
'vote']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "/home/titsnium/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/views/generic/base.py", line 84, in view
return self.dispatch(request, *args, **kwargs)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/views/generic/base.py", line 119, in dispatch
return handler(request, *args, **kwargs)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/views/generic/edit.py", line 184, in post
return super().post(request, *args, **kwargs)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/views/generic/edit.py", line 153, in post
return self.form_valid(form)
File "/home/titsnium/Documents/eduzec/forum/views.py", line 78, in form_valid
form.question = Question.objects.get('id')
File "/home/titsnium/.local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/db/models/query.py", line 482, in get
clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/db/models/query.py", line 1071, in filter
return self._filter_or_exclude(False, args, kwargs)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/db/models/query.py", line 1089, in _filter_or_exclude
clone._filter_or_exclude_inplace(negate, args, kwargs)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/db/models/query.py", line 1096, in _filter_or_exclude_inplace
self._query.add_q(Q(*args, **kwargs))
File "/home/titsnium/.local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1502, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1532, in _add_q
child_clause, needed_inner = self.build_filter(
File "/home/titsnium/.local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1377, in build_filter
lookups, parts, reffed_expression = self.solve_lookup_type(arg)
File "/home/titsnium/.local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1187, in solve_lookup_type
_, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
File "/home/titsnium/.local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1677, in names_to_path
raise FieldError(
Exception Type: FieldError at /answer/
Exception Value: Cannot resolve keyword 'i' into field. Choices are: add_time, answer, detail, id, num_vote_down, num_vote_up, slug, tags, title, user, user_id, vote_score, votes
views.py:
from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse, HttpResponseRedirect
from django.views import View
from django.views.generic.list import ListView
from django.views.generic import DetailView, CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Count
from requests import request
from .forms import QuestionForm, AnswerForm
from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse, reverse_lazy
from . import models
from .models import Question, Answer, Comment
from vote.models import UP, DOWN
from .utilities import cast_vote, save_text_help
class QuestionsView(ListView):
model = Question
template_name = 'forum/questions.html'
context_object_name = "quests"
paginate_by = 5
def get_queryset(self):
qs = super(QuestionsView, self).get_queryset()
search = self.request.GET.get('q')
if search:
qs = qs.filter(title__icontains=search)
qs = qs.order_by("-id")
qs = qs.annotate(count_of_answers=Count('answer'))
return qs
class QuestionDetailView(DetailView):
model = Question
template_name = 'forum/detail.html'
context_object_name = 'quest'
def get_context_data(self, **kwargs):
context = super(QuestionDetailView, self).get_context_data(**kwargs)
context['tags'] = self.object.tags.split(',')
answers = Answer.objects.filter(question=self.object).order_by('-vote_score')
comments = []
for answer in answers:
comments.append(Comment.objects.filter(answer=answer))
context['answers_comments'] = zip(answers, comments)
return context
def get_queryset(self):
qs = super(QuestionDetailView, self).get_queryset()
qs = qs.annotate(count_of_answers=Count('answer'))
return qs
class AskForm(SuccessMessageMixin , CreateView):
template_name = 'forum/ask-question.html'
model = Question
form_class = QuestionForm
success_message = 'Success!'
def form_valid(self, form):
form.instance.user = self.request.user
form.save()
return super(AskForm, self).form_valid(form)
class AnswerForm(SuccessMessageMixin, CreateView):
template_name = 'forum/answer-question.html'
model = Answer
form_class = AnswerForm
success_message = 'Success!'
def form_valid(self, form):
form.question = Question.objects.get('id')
form.instance.user = self.request.user
form.save()
return super(AskForm, self).form_valid(form)
class WriteCommentAnswerView(View):
def post(self, request):
text=request.POST['text']
id=request.POST['id']
text_type = request.POST['type']
user=request.user
if text_type == "comment":
return render(request, 'forum/includes/single_comment.html', {'comment': save_text_help(text, id, text_type, user)})
else:
return render(request, 'forum/includes/single_answer.html', {'answer': save_text_help(text, id, text_type, user)})
class SaveVoteView(LoginRequiredMixin, View):
def post(self, request):
id = request.POST['id']
user_id = request.user.id
vote_to = request.POST['vote_to']
vote_type = request.POST['vote_type']
return JsonResponse({'bool': cast_vote(vote_type, vote_to, user_id, id)})
models.py:
from time import time
from django.conf import settings
from django.db import models
from vote.models import VoteModel
from django.urls import reverse
from django.utils.text import slugify
from users.models import CustomUser
# This is the question model
class Question(VoteModel, models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
title = models.CharField(max_length=30)
slug = models.SlugField(unique=True)
detail = models.TextField()
tags = models.TextField(default='')
add_time = models.DateTimeField(auto_now_add=True)
def get_absolute_url(self):
return f"/questions/"
def __str__(self):
return self.title
# This is the answer model
class Answer(VoteModel, models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
detail = models.TextField()
add_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.detail
class Comment(models.Model):
answer = models.ForeignKey(Answer, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='comment_user')
comment = models.TextField(default='')
add_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Comment on \"{self.answer}\" by {self.user}"
urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('questions/', views.QuestionsView.as_view(), name='questions'),
path('ask/', views.AskForm.as_view(), name='ask'),
path('answer/', views.AnswerForm.as_view(), name='answer'),
path('detail/<pk>', views.QuestionDetailView.as_view(), name='detail'),
path('save-text', views.WriteCommentAnswerView.as_view(), name='save-text'),
path('save-vote', views.SaveVoteView.as_view(), name='save-vote'),
]
forms.py:
from django import forms
from django.forms import ModelForm
from .models import Answer, Question
class QuestionForm(ModelForm):
class Meta:
model = Question
fields = ['title', 'detail', 'tags']
exclude = ('user', 'add_time')
class AnswerForm(ModelForm):
class Meta:
model = Answer
fields = ['detail']
exclude = ('user', 'add_time')
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
