Комментарий () получил неожиданный аргумент ключевого слова «начальный»

Я создаю блог Django, и при попытке реализовать систему комментариев я получил указанную выше ошибку. Я не совсем уверен, что вызвало проблемы, но я опишу некоторые вещи, которые я сделал, прежде чем я получил ошибку.

Я решил использовать представления Django на основе классов для отображения всех своих данных. В показанном PostDetailView я попытался сделать так, чтобы он наследовал как от DetailView, так и от FormView, чтобы я отображал как детали, так и форму.

Закомментированный код — это код, который я собирался использовать для представления формы, но я не знал, как заставить его использовать тот же шаблон и маршрут URL.

Views.py

from django.views.generic import DetailView, FormView
from .forms import Comment
from .models import Post

class PostDetailView(DetailView, FormView):
    model = Post
    template_name= 'optionhouseapp/post-detail.html'
    form_class = Comment

    def form_valid(self, form):
        return super().form_valid(form)

# class CommentFormView(FormView):
#     template_name= 'optionhouseapp/post-detail.html'
#     form_class = Comment
#     success_url ='/'

#     def form_valid(self, form):
#         return super().form_valid(form)

Вот страница формы

формы.py

from django import forms 
from .models import Comment

class CommentForms(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('name', 'email', 'body')

Вот связанная модель

модели.py

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    name = models.CharField(max_length=80)
    email = models.EmailField()
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=False)

    class Meta:
        ordering = ['created_on']

    def __str__(self):
        return "Comment {} by {}".format(self.body, self.name)

Вот URL-адреса

urls.py

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

urlpatterns = [
    path('', views.IndexListView.as_view(), name='index'),
    path('postlist/', views.PostListView.as_view(), name='post-list' ),
    path('about/', views.about, name='about'),
    path('post/<int:pk>/', views.PostDetailView.as_view(), name='post-detail'),
    path('post-create', views.CreatePostView.as_view(), name='post_form'),
    path('post/<int:pk>/update', views.UpdatePostView.as_view(), name='post-update' ),
    path('post/<int:pk>/delete', views.DeletePostView.as_view(), name='post-delete')

]

Вот HTML, который я пытаюсь отобразить

пост-detail.html

{%extends 'optionhouseapp/base.html'%}
{% load crispy_forms_tags %}

{%block content%}

    <div class='container'>
        {{object.image}} <br>
        {{object.title}} <br>
        {{object.author}} <br>
        {{object.date}} <br>
        {{object.content}} <br>
    </div>

    <div class='container'>
        {% if user.is_authenticated and user == object.author %}
            <a href = "{% url 'post-update' post.id %}">Update</a>
            <a href = "{% url 'post-delete' post.id %}">Delete</a>
        {% endif %}
    </div>

    <div class = "container">
        <form method = "POST">
            {% csrf_token %}
            <legend></legend>
            {{form | crispy}}
            <input type = "submit" value = "Submit">
        </form>
    </div>

{%endblock content%}

Вот ошибка, которую я получаю

Traceback (most recent call last):
  File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/detail.py", line 107, in get
    context = self.get_context_data(object=self.object)
  File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/detail.py", line 100, in get_context_data
    return super().get_context_data(**context)
  File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/edit.py", line 66, in get_context_data
    kwargs['form'] = self.get_form()
  File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/views/generic/edit.py", line 33, in get_form
    return form_class(**self.get_form_kwargs())
  File "/Users/kevinhudgens/Developer/Environments/OptionHouse/env/lib/python3.8/site-packages/django/db/models/base.py", line 501, in __init__
    raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
TypeError: Comment() got an unexpected keyword argument 'initial'
[26/Dec/2020 04:51:31] "GET /post/6/ HTTP/1.1" 500 89557

Пожалуйста, любая помощь, которую я могу получить, будет по-настоящему оценена.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 622
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы определили свою форму как CommentForm, но в DetailView вы используете form_class = Comment. Вы импортируете .forms import Comment, вместо этого вы должны использовать

.forms import CommentForm 
....
...
 form_class = CommentForm

Представления на основе классов могут быть сложными при использовании форм, я бы предложил использовать представления на основе функций при работе с формами и другими сложными вещами.

from .forms import CommentForm
from .models import Post

def PostDetailView(request, slug):
    form = CommentForm()
    post = Post.objects.filter(slug=slug).first()


    comments = post.comments.all()

    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = post
            comment.save()
            form = CommentForm()

            context  = {'post':post,'form':form,'comments':comments}
            return redirect('post-detail',slug=post.slug)

    context  = {'post':post,'form':form,'comments':comments}
    return render(request,'blog/post_detail.html', context)

Большое спасибо. Вы были правы насчет моей ошибки. Я ценю помощь

Kevin H 26.12.2020 13:43

Другие вопросы по теме