[英]django form submit not working
我創建了for接口,供用戶按值過濾數據庫中的內容。
課堂上的觀點
class FilterCommentsUIView(TemplateView,FormView):
template_name = 'allcomments.html'
form_class = CommentFilterForm
def get_context_data(self, **kwargs):
context = super(FilterCommentsUIView, self).get_context_data(**kwargs)
logger.debug("Entered context data")
logger.debug(self.request.method)
if self.request.method == 'POST':
form = CommentFilterForm(self.request.POST)
loggeer.debug("Entered POST")
if form.is_valid():
logger.debug("Entered is valid")
parenttype = self.request.POST['pchoice']
users = self.request.POST.get('users')
tags = self.request.POST.get('tags')
fdate = self.request.POST.get('fdate')
tdate = self.request.POST.get('tdate')
typeuser = self.request.POST.get('typeuser')
query = self.request.POST.get('query')
userid = User.objects.get(username ='pavan')
comments = Item.objects.all().filter(user = userid.id).order_by('-created')
paginator = Paginator(comments,20)
page = self.request.GET.get('page')
try:
comments = paginator.page(page)
except PageNotAnInteger:
comments = paginator.page(1)
except EmptyPage:
comments = paginator.page(paginator.num_pages)
context['comments']=comments
context['form']=CommentFilterForm
else:
logger.debug("Entered isvalid else")
logger.debug(form.errors)
else:
logger.debug("Entered Else of POST")
form = CommentFilterForm()
comments = Item.objects.all().order_by('-created')
paginator = Paginator(comments, 20)
page = self.request.GET.get('page')
try:
comments = paginator.page(page)
except PageNotAnInteger:
comemnts = paginator.page(1)
except EmptyPage:
comments = paginator.page(paginator.num_pages)
context['comments']=comments
context['form']= form
return context
當我單擊提交按鈕時,它不會進入POST if部分。 它總是去其他部分。 我究竟做錯了什么 ?
在此先感謝您的幫助。 帕文
正如其他人所說的那樣,您對所有代碼都在get_context_data
的事實有get_context_data
。 實際上,您甚至不需要使用get_context_data
即可完成您想做的事情。
據我所知,您正在嘗試在頁面上發表評論。 然后將表單提交回頁面,並獲得過濾掉的一組注釋,並進行渲染。 這是一個視圖解決方案,除了可以更充分地使用基於泛型類的視圖之外,它可以更好地滿足您的需求。
class FilterCommentsUIView(FormMixin, ListView):
template_name = 'allcomments.html'
form_class = CommentFilterForm
paginate_by = 20
model = Item
context_object_name = 'comments'
qs_kwargs = {}
def post(self, request, *args, **kwargs):
"""
Handles POST requests, instantiating a form instance with the passed
POST variables and then checked for validity.
"""
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def get_queryset(self):
qs = super(FilterCommentsUIView, self).get_queryset()
if self.qs_kwargs:
return qs.filter(**self.qs_kwargs)
return qs
def form_valid(self, form):
parenttype = form.cleaned_data['pchoice']
users = form.cleaned_data('users')
tags = form.cleaned_data('tags')
fdate = form.cleaned_data('fdate')
tdate = form.cleaned_data('tdate')
typeuser = form.cleaned_data('typeuser')
query = form.cleaned_data('query')
userid = User.objects.get(username ='pavan')
# put logic here on what to expand into a filter on orm
self.qs_kwargs['user'] = userid.id
self.render_to_response(self.get_context_data())
我沒有運行此代碼,但這就是它的工作方式。
它使用FormMixin
為我們提供表單功能以及帶有Item
類的ListView
。 這需要查詢對象並對其進行分頁,以及基本的get
方法。
另外, ListView
繼承自TemplateResponseMixin
,后者具有您的模板代碼,因此您無需繼承TemplateView
因此在上面的代碼中,我刪除了它。
基於ListView
使用派發方法的基本View
類的本質,它會檢測您是否正在執行GET
, POST
, PUT
, DELETE
等。因此,它將在視圖上調用適當的方法。 在這種情況下,由於您正在執行POST
,它將在視圖中調用post方法。 post
的FormView
的實現是這樣的:
def post(self, request, *args, **kwargs):
"""
Handles POST requests, instantiating a form instance with the passed
POST variables and then checked for validity.
"""
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
由於我們沒有使用FormView
,而是使用FormMixin
我們需要包括它。
因此,它所做的就是獲取在self.form_class
設置的表單類以實例化它,然后檢查它是否有效。 如果是這樣,則調用form_valid
方法。 因此,我們覆蓋了上面的form_valid
方法。 由於它通過了它的表單,並且已經清除了所有數據,因此我們可以使用常規的Django形式form.cleaned_data
。 這有助於我們提高安全性,因此我們應該使用它來獲取信息。
在form_valid
方法的最后一部分中,我們返回render_to_response
。 通常,這只是重定向到self.success_url
,但是我們要呈現頁面,因此我們只需要執行一次render_to_response並將其傳遞到上下文數據中即可。 我們將之稱為self.get_context_data()
因為這是構建所有數據以分頁所需注釋的原因。
現在有點magic
。 如果您注意到有self.qs_kwargs
。 這在GCBV中通常不存在,但是我為此實現添加了一些東西。 在這里,您將放置邏輯以構建過濾器字典,以在get_queryset
的orm調用中get_queryset
。 我們將其打包到字典中,因為在上面的get_queryset
方法中,如果需要,我們將其全部解壓縮以進行過濾。
因此,如果您有:
qs_kwargs = {'user': user.id, 'created__gt': somedate}
你也是:
qs.filter(**qs_kwargs)
或Item.objects.filter(**qs_kwargs)
大致與執行以下操作相同:
qs.filter(user=user.id, created__gt=somedate)
或Item.objects.filter(user=user.id, created__gt=somedate)
最后,如果你注意get_queryset
方法,你注意到它返回所有的結果,就像你想要的,除非qs_kwargs
填充從發生form_valid
方法。 因此,它需要考慮頁面上的GET
和POST
。
為了使事情簡單,您的html應該看起來像這樣:
<html>
<head></head>
<body>
<div>
{% for comment in comments %}
{{ comment }}
{% endfor %}
<ul class="pagination">
{% if page_obj.has_previous() %}
<li><a href="?page={{ page_obj.previous_page_number }}">Previous</a></li>
{% endif %}
{% for pg in paginator.page_range %}
{% if page_obj.number == pg %}
<li class="active"><a href="?page={{ pg }}">{{ pg }}</a></li>
{% else %}
<li><a href="?page={{ pg }}">{{ pg }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.has_next() %}
<li><a href="?page={{ page_obj.next_page_number() }}">Next</a></li>
{% endif %}
</ul>
</div>
<div>
<form action="" method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="submit" />
</form>
</div>
</body>
</html>
希望能有所幫助。
這需要在form_valid()方法中完成,而不是在get_context_data方法中完成。 get_context_data僅用於在請求期間向模板提供額外的數據(即上下文)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.