首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListView中的Django表单,表格后的错误

ListView中的Django表单,表格后的错误
EN

Stack Overflow用户
提问于 2020-03-04 19:39:08
回答 1查看 511关注 0票数 4

我试图为我的网站实现一个聊天功能。为了做到这一点,我遵循了以下教程:https://channels.readthedocs.io/en/latest/tutorial/

然后,我对代码做了一些修改,以便实现它。在此之前,一切都很顺利。现在,我想将表单数据存储在数据库中,这就是问题出现的地方。但首先我的代码是:

urls.py

代码语言:javascript
复制
    from django.urls import path
    from .views import ChatOverView

    urlpatterns = [
        path('<int:pk>/', ChatOverView.as_view(), name='chat-explicit'),
        path('', ChatOverView.as_view(), name='chat-home'),
    ]

views.py (这里有很多代码可能不需要用于这个问题,但由于我不知道它的哪一部分可以忽略,所以我只需发布整个文件内容):

代码语言:javascript
复制
from django.views.generic import ListView
from django.views.generic.edit import FormMixin, FormView
from django.db.models import Q
from django.urls import resolve
from django.contrib.auth.models import User
from django.shortcuts import get_object_or_404

from .models import Message
from .forms import MessageRegisterForm


class ChatOverView(ListView, FormMixin):
    model = Message
    template_name = 'chat/home-chat.html'
    form_class = MessageRegisterForm
    success_url = '/thanks/'

    def form_valid(self, form):
        form = self.get_form()
        if form.is_valid():
            data = form.cleaned_data
            return super().form_valid(form)

    def get_context_data(self, *args, **kwargs):
        context = super(ChatOverView, self).get_context_data(*args, **kwargs)

        messages_raw = reversed(Message.objects.filter(Q(sender=self.request.user) | Q(receiver=self.request.user)))
        messages = {}

        for mes in messages_raw:
            # i am receiver
            if mes.sender != self.request.user:
                if mes.sender in messages:
                    messages[mes.sender].append({"received": mes})
                else:
                    messages.update({mes.sender: [{"received": mes}]})
            # i sent
            else:
                if mes.receiver in messages:
                    messages[mes.receiver].append({"sent": mes})
                else:
                    messages.update({mes.receiver: [{"sent": mes}]})

        active_user = self.get_active_chat(messages)
        chatroom_name = self.get_chatroom_name(active_user)
        context.update(messages_data=messages, active=active_user, roomname=chatroom_name)
        return context

    def get_chatroom_name(self, active_chat):
        # my convention
        ids = [active_chat.id, self.request.user.id]
        ids.sort()
        return str(ids[0]) + '_' + str(ids[1])

    def get_active_chat(self, messages):
        url_name = resolve(self.request.path_info).url_name
        if url_name == "chat-home":
            return list(messages.keys())[0]
        else:
            pk_user = self.request.build_absolute_uri().split("/")[-2]
            user = get_object_or_404(User, pk=pk_user)
            return user

home-chat.html

代码语言:javascript
复制
{% extends "solawi/base.html" %}
{% load define_dictfilters %}
{% block content %}
            <form class="bg-light" method="post">
                <div class="input-group">
                    {% csrf_token %}
                    {{ form }}
                    <div class="input-group-append">
                        <button type="submit" id="chat-message-submit" value="enter">send</button>
                    </div>
                </div>
            </form>    
{% endblock content %}

models.py

代码语言:javascript
复制
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


class Message(models.Model):
    sender = models.ForeignKey(User, related_name="sender", on_delete=models.CASCADE)
    receiver = models.ForeignKey(User, related_name="receiver", on_delete=models.CASCADE)
    content = models.TextField()
    date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.sender.username + ' to ' + self.receiver.username

其余的文件/设置入口与上面链接的教程相同。

现在出现了问题:当提交表单时,我得到以下错误:Method Not Allowed (POST): /chat/ Method Not Allowed: /chat/ HTTP POST /chat/ 405 [0.00, 127.0.0.1:54424]

我怎么才能修好它?谢谢你的帮助!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-04 20:13:18

ListView实现了一个get()方法,但没有实现post()方法。您需要实现一个post()方法,以便视图允许POST请求。

您可以用子类django.views.generic.ProcessFormView来获得这个结果,或者,如果您确实需要一个ListView,那么您可以向处理表单验证和其他需要做的任何事情的类中添加一个post()方法。下面是ProcessFormView实现它的方式:

代码语言:javascript
复制
    def post(self, request, *args, **kwargs):
        """
        Handle POST requests: instantiate a form instance with the passed
        POST variables and then check if it's valid.
        """
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60533548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档