我想从表单(即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')),
]
提交表单后,数据被添加到数据库中,但出现上述错误。
答案 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)
,然后基础的FormMixin
将redirect 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;
}
后在 进行其他操作(因为它将对象保存到数据库中)。