Django:使用CreateView进行表单POST之后,“配置不正确”

时间:2019-06-04 18:46:52

标签: python django django-urls

我想从表单(即CreateView)向我的数据库添加数据。不幸的是,发布后我得到了

'在/ persons / new /'

中配置不正确

我正在尝试编辑 urls.py ,但我想我错过了一些东西。

我的 views.py

    "build:appone": "webpack --mode=development --config ./src/AppOne.App/webpack.config.ts",
    "build:apptwo": "webpack --mode=development --config ./src/AppTwo.App/webpack.config.ts",

我在项目中的 urls.py

class PersonListView(ListView):
    model = Person
    template_name = 'app/home.html'
    context_object_name = 'users'

class PersonCreateView(CreateView):
    model = Person
    fields = ['name','surname']

我在应用中的 urls.py

*imports*
urlpatterns = [
    path('admin/',admin.site.urls),
    path('persons/', include('app.urls')),
]

提交表单后,数据被添加到数据库中,但出现上述错误。

1 个答案:

答案 0 :(得分:1)

简短答案:您应该在视图中指定success_url [Django-doc]属性,或覆盖form_valid [Django-doc]

CreateView [Django-doc](大多数视图中使用FormMixin [Django-doc])中,您需要指定成功处理表单后需要执行的操作。

默认情况下,ModelFormMixin [Django-doc]首先会save the object [GitHub]

def form_valid(self, form):
    """If the form is valid, save the associated model."""
    self.object = form.save()
    return super().form_valid(form)

,然后基础的FormMixinredirect to the success_url [GitHub]

def form_valid(self, form):
    """If the form is valid, redirect to the supplied URL."""
    return HttpResponseRedirect(self.get_success_url())

get_success_url will retrieve the success_url attribute [GitHub],如果您发现ImproperlyConfigured错误,则会引发def get_success_url(self): """Return the URL to redirect to after processing a valid form.""" if not self.success_url: raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.") return str(self.success_url) # success_url may be lazy错误:

success_url

因此,您可以在视图中指定from django.urls import reverse_lazy class PersonCreateView(CreateView): model = Person fields = ['name','surname'] success_url = reverse_lazy('persons'),例如使用reverse_lazy [Django-doc]

persons

此处path(..)是我们重定向到的form_valid名称。重定向通常是处理成功表格的首选方式:它是Post/Redirect/Get architectural pattern [wiki]的一部分。如果您要为POST请求呈现页面,则在浏览器中刷新页面的用户将重新发送相同的数据到服务器,因此实际上可能会创建 second 对象。

另一种选择是覆盖super().form_valid(form),并在调用#define _WINSOCK_DEPRECATED_NO_WARNINGS #include <Winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <iostream> #include <string> #include <string.h> #pragma comment(lib, "ws2_32.lib") #define ZeroMemory using namespace std; WSADATA wsadata; SOCKET Client; SOCKADDR_IN Server; unsigned int Port = 5020; int ret; char buf[4096]; int len, tolen, fromlen, namelen; int main(int argc, char * argv[]) { // Initialize Winsocket ret = WSAStartup(MAKEWORD(2, 2), &wsadata); // CHECKS THE SOCKET STATUS if (ret == SOCKET_ERROR) { printf("Client: Winstock Status is: %s ", wsadata.szSystemStatus); WSACleanup(); cout << endl; } else { printf("Client: Winstock Status is: %s ", wsadata.szSystemStatus); cout << endl; } // Client Address Server.sin_family = AF_INET; Server.sin_port = htons(Port); inet_pton(AF_INET, "127.0.0.1", &Server.sin_addr); // Create Socket ret = Client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // CHECKS IF SOCKET IS CREATED if (Client == INVALID_SOCKET) { cout << "Client: Can't Create Socket! ERROR: %s " << WSAGetLastError(); WSACleanup(); cout << endl; } // Bind Socket ret = bind(Client, (sockaddr*)& Server,sizeof(Server)); // CHECKS IF SOCKET IS BINDED if (ret == INVALID_SOCKET) { cout << "Client: Failed to bind socket" << WSAGetLastError(); ; cout << endl; } string s(argv[1]); // SendTo() ret = sendto ( Client, s.c_str(), s.size() + 1, 0, (sockaddr*) & Server, sizeof(Server) ); if (ret == SOCKET_ERROR); { cout << "That did not work! Error Code: " << WSAGetLastError(); cout << endl; } // CloseSocket closesocket(Client); // CleanUp Winsocket WSACleanup(); return 0; } 后在 进行其他操作(因为它将对象保存到数据库中)。