Django:如何在新模板中的另一个模型上使用 CreateView 的 form_valid() 返回的响应?
Django : How can I use the response returned by form_valid() of a CreateView on another model in a new template?
我正在学习 Django,我确信解决方案很简单,但我找不到;
我有一个模型 "profile" 需要通过请求进行过滤。请求和答案需要保存在数据库中。但我不希望用户在任何时候都看到所有的配置文件。
所以我写了两个模型:第一个包含请求(MyRequest),第二个包含潜在的答案(Profile)。配置文件是在 Django 管理中导入 csv 创建的。
我编写了一个运行良好的代码,但我无法弄清楚如何在模板中发送我的响应以使用所有自定义项和证券作为 csrf_token。
目前它显示与请求相同的 url 响应,我在那里被阻止了
我曾尝试将 get_succes_url 与 HttpResponseRedirect 一起使用,通常我可以使用 (?P\d+)/$' 成功地做到这一点 url 但它没有工作可能是因为这两个模型不共享任何密钥?
我试过并成功 url 但我觉得我做错了什么
"""Models"""
class Profile(models.Model):#probgerme probpvt probservice probATCDpvt probATCDbmr probNB
profname= models.CharField(max_length=20)
bq = models.ForeignKey(Bq, on_delete=models.CASCADE)#, blank=True
test1 = models.CharField(max_length=100)
test2 = models.CharField(max_length=100)
test3 = models.CharField(max_length=100)
class MyRequest(models.Model):#probgerme probpvt probservice probATCDpvt probATCDbmr probNB
reqname = models.CharField(max_length=20)
bq = models.ForeignKey(Bq, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL,default=0, related_name="user2")
test1 = models.CharField(max_length=100)
test2 = models.CharField(max_length=100)
"""Forms"""
class MyRequestCreateForm(forms.models.ModelForm):
class Meta:
model = MyRequest
fields = ('bq','test1','test2')
def save(self, *args, **kwargs):
myrequest = super().save(*args, **kwargs)
myrequest.save()
"""URL """
url(r'^essai_create/$', views.MyRequestCreateView.as_view(), name='my_request'),
"""Views"""
class MyRequestCreateView(LoginRequiredMixin, generic.CreateView):
form_class = MyRequestCreateForm
model = MyRequest
def get_queryset(self):
queryset = super().get_queryset().filter(user=self.request.user)
return queryset
def get_form(self, form_class=None):
form = super().get_form(form_class)
form.fields['test1'].required = True
return form
def form_valid(self, form):
form.instance.user = self.request.user
self.object = form.save()
data = form.cleaned_data
test1 = data['test1']
test2 = data['test2']
print('data',data)
try:
Profile.objects.get(test1 = test1, test2 = test2 )
tested3= Profile.objects.get(test1 = test1, test2 = test2).test3.split(',')
except ObjectDoesNotExist:
tested3 = ['nothing']*5
reponse = "Votre requête : test1 = " + test1 + ", test2 = " + test2 + "<br>val1, "+tested3[0] + "<br>val2, "+tested3[1] + "<br>val3 " + tested3[2]+ "<br>val4, " + tested3[3]
return HttpResponse(reponse)
"""Template myrequest_form.html"""
{% extends 'base2.html' %}
{% load bootstrap %}
{% load crispy_forms_tags %}
{% load static %}
{% block content %}
<div class="container ">
<form method="POST" enctype="multipart/form-data" id="project-form">
{% csrf_token %}
<form method="post" >
{% csrf_token %}
{{ form.bq|as_crispy_field }}
<br>
<div class="col-6">
Information sur le test1 {{ form.test1 }} <br>
</div>
<br>
<div class="col-6">
Information sur le test2 {{ form.test2 }}<br>
</div>
<br>
<br><br>
<button id = "submitRequest" aria-pressed="true" class="btn btn-primary active" onclick="showPleaseWait()" type="submit" >Check for best answer</button>
</form>
</form>
</div>
{% endblock %}
当前在 http://localhost:8000/myapp/essai_create/ 中打开的模板中单击 "Check for best answer" 按钮后,同样 url
http://localhost:8000/myapp/essai_create/
显示:
Votre requête : test1 = nouveau, test2 = Rouge
值 1, 7
值 2、12
值 3、4
值 4、5
不幸的是,我仍然发现很难理解您想要什么。也许你想要的是找到匹配提交数据的配置文件,然后重定向到它?在这种情况下,您需要在 form_valid
内执行该重定向,并为您重定向到的配置文件定义一个 DetailView。所以:
class MyRequestCreateView(LoginRequiredMixin, generic.CreateView):
...
def form_valid(self, form):
form.instance.user = self.request.user
obj = form.save()
try:
profile = Profile.objects.get(test1=obj.test1, test2=obj.test2)
return redirect('profile', pk=profile.id)
except Profile.DoesNotExist:
return redirect('/') # or wherever
class ProfileDetail(LoginRequiredMixin, generic.DetailView):
model = Profile
和 URL:
path('profile_detail/<int:pk>', ProfileDetail, name='profile')
@Daniel Roseman 解决方案(创建一个简单的 ProfileDetail 视图)很棒!我只需要更改
的路径(我使用的是 Django 2.11)
url(r'profiledetail/(?P<pk>\d+)$', views.ProfileDetail.as_view(), name='profile')
并且需要更改 createview
def form_valid(self, form):
form.instance.user = self.request.user
self.object = form.save()
data = form.cleaned_data
test1 = data['test1']
test2 = data['test2']
profile=ProbasProfile.objects.get(test1 = test1, test2=test2)
return redirect('profile', pk=profile.id)
然后在为答案创建的新模板中
{{profile.test1}}{{profile.test2}}{{profile.test3}}
当然还有他写的 class ProfileDetail
我正在学习 Django,我确信解决方案很简单,但我找不到;
我有一个模型 "profile" 需要通过请求进行过滤。请求和答案需要保存在数据库中。但我不希望用户在任何时候都看到所有的配置文件。
所以我写了两个模型:第一个包含请求(MyRequest),第二个包含潜在的答案(Profile)。配置文件是在 Django 管理中导入 csv 创建的。
我编写了一个运行良好的代码,但我无法弄清楚如何在模板中发送我的响应以使用所有自定义项和证券作为 csrf_token。
目前它显示与请求相同的 url 响应,我在那里被阻止了
我曾尝试将 get_succes_url 与 HttpResponseRedirect 一起使用,通常我可以使用 (?P\d+)/$' 成功地做到这一点 url 但它没有工作可能是因为这两个模型不共享任何密钥? 我试过并成功 url 但我觉得我做错了什么
"""Models"""
class Profile(models.Model):#probgerme probpvt probservice probATCDpvt probATCDbmr probNB
profname= models.CharField(max_length=20)
bq = models.ForeignKey(Bq, on_delete=models.CASCADE)#, blank=True
test1 = models.CharField(max_length=100)
test2 = models.CharField(max_length=100)
test3 = models.CharField(max_length=100)
class MyRequest(models.Model):#probgerme probpvt probservice probATCDpvt probATCDbmr probNB
reqname = models.CharField(max_length=20)
bq = models.ForeignKey(Bq, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL,default=0, related_name="user2")
test1 = models.CharField(max_length=100)
test2 = models.CharField(max_length=100)
"""Forms"""
class MyRequestCreateForm(forms.models.ModelForm):
class Meta:
model = MyRequest
fields = ('bq','test1','test2')
def save(self, *args, **kwargs):
myrequest = super().save(*args, **kwargs)
myrequest.save()
"""URL """
url(r'^essai_create/$', views.MyRequestCreateView.as_view(), name='my_request'),
"""Views"""
class MyRequestCreateView(LoginRequiredMixin, generic.CreateView):
form_class = MyRequestCreateForm
model = MyRequest
def get_queryset(self):
queryset = super().get_queryset().filter(user=self.request.user)
return queryset
def get_form(self, form_class=None):
form = super().get_form(form_class)
form.fields['test1'].required = True
return form
def form_valid(self, form):
form.instance.user = self.request.user
self.object = form.save()
data = form.cleaned_data
test1 = data['test1']
test2 = data['test2']
print('data',data)
try:
Profile.objects.get(test1 = test1, test2 = test2 )
tested3= Profile.objects.get(test1 = test1, test2 = test2).test3.split(',')
except ObjectDoesNotExist:
tested3 = ['nothing']*5
reponse = "Votre requête : test1 = " + test1 + ", test2 = " + test2 + "<br>val1, "+tested3[0] + "<br>val2, "+tested3[1] + "<br>val3 " + tested3[2]+ "<br>val4, " + tested3[3]
return HttpResponse(reponse)
"""Template myrequest_form.html"""
{% extends 'base2.html' %}
{% load bootstrap %}
{% load crispy_forms_tags %}
{% load static %}
{% block content %}
<div class="container ">
<form method="POST" enctype="multipart/form-data" id="project-form">
{% csrf_token %}
<form method="post" >
{% csrf_token %}
{{ form.bq|as_crispy_field }}
<br>
<div class="col-6">
Information sur le test1 {{ form.test1 }} <br>
</div>
<br>
<div class="col-6">
Information sur le test2 {{ form.test2 }}<br>
</div>
<br>
<br><br>
<button id = "submitRequest" aria-pressed="true" class="btn btn-primary active" onclick="showPleaseWait()" type="submit" >Check for best answer</button>
</form>
</form>
</div>
{% endblock %}
当前在 http://localhost:8000/myapp/essai_create/ 中打开的模板中单击 "Check for best answer" 按钮后,同样 url
http://localhost:8000/myapp/essai_create/
显示:
Votre requête : test1 = nouveau, test2 = Rouge
值 1, 7
值 2、12
值 3、4
值 4、5
不幸的是,我仍然发现很难理解您想要什么。也许你想要的是找到匹配提交数据的配置文件,然后重定向到它?在这种情况下,您需要在 form_valid
内执行该重定向,并为您重定向到的配置文件定义一个 DetailView。所以:
class MyRequestCreateView(LoginRequiredMixin, generic.CreateView):
...
def form_valid(self, form):
form.instance.user = self.request.user
obj = form.save()
try:
profile = Profile.objects.get(test1=obj.test1, test2=obj.test2)
return redirect('profile', pk=profile.id)
except Profile.DoesNotExist:
return redirect('/') # or wherever
class ProfileDetail(LoginRequiredMixin, generic.DetailView):
model = Profile
和 URL:
path('profile_detail/<int:pk>', ProfileDetail, name='profile')
@Daniel Roseman 解决方案(创建一个简单的 ProfileDetail 视图)很棒!我只需要更改
的路径(我使用的是 Django 2.11)url(r'profiledetail/(?P<pk>\d+)$', views.ProfileDetail.as_view(), name='profile')
并且需要更改 createview
def form_valid(self, form):
form.instance.user = self.request.user
self.object = form.save()
data = form.cleaned_data
test1 = data['test1']
test2 = data['test2']
profile=ProbasProfile.objects.get(test1 = test1, test2=test2)
return redirect('profile', pk=profile.id)
然后在为答案创建的新模板中
{{profile.test1}}{{profile.test2}}{{profile.test3}}
当然还有他写的 class ProfileDetail