繁体   English   中英

如何在 Django 中的同一表单上使用 GET 和 POST

[英]How can I use GET and POST on the same form in Django

我有一个项目 wiki,使用来自 CS50W 的 Django 和 python 并停留在我必须检查标题是否存在的地方,如果它存在,我将提供消息和选项来更改标题或编辑它,现在这部分正在使用 GET 方法,如果主题不存在,它会将焦点设置为 textarea,用户可以广告有关标题的信息并将其保存到新文件中,现在使用methot=POST。 如果我编写以下代码,我的检查工作

createNewPage.html

<div class="form-group" style="margin-right: 20%">        
     <form id="newTitle" action="{% url 'save' %}" method="GET">
        {% csrf_token %}        
            {% block newTitle %}
                <label>{{ newTitle_form.title.label }}</label>
                {{ newTitle_form.title }}          
            {% endblock %}
     </form>
        {% if messages %}
            <div id="messageDiv" class="alert alert-info" role="alert">
                {% for message in messages %}                
                    {{ message }}                
                {% endfor %}         
            </div>        
        {% endif %}
        {% if messages %}
            <div class="h1 flex-container btn-save-placement" style="height: 0px; padding-top: 0px; margin-right: 0%">
                <div>
                    <a role="button" id="changeTopic" class="btn btn-outline-dark" href="{% url 'new_topic' %}">Change</a>
                    <a role="button" class="btn btn-outline-dark" href="{% url 'edit' pagetitle %}">Edit</a>
                </div>
            </div>  
        {% endif %}
    </div>
    
    <div class="form-group" style="margin-right: 20%; margin-top: 25px">
        {% block textArea %}
            <label>{{ newText_form.text.label }}</label>
            {{ newText_form.text }}
        {% endblock %}
    </div> 
    <div class="btn-save-placement flex-container" style="height: 48px; padding-top: 0px;">
       <button class="btn btn-outline-dark" href="{% url 'save' %}" type="submit" formmethod="POST">Save New Page</a>
    </div>
    <script>
        function blurFunction() {
            var newTitleText = document.getElementById("titleCheck");
            if (newTitleText.value !== null && newTitleText.value !== "") {
                document.getElementById("newTitle").requestSubmit();
            }                    
        }
    </script>

如果我从第 8 行更改为第 35 行,然后检查将不起作用,但它会保存新文件。 我可以改变什么来让两者都工作。

视图.py

def save(request):
    if request.method == "GET":
        searchPage = request.GET.get('title','')
        if(util.get_entry(searchPage) is not None):
            messages.info(request, 'The Page '  + searchPage +   ' Already Exists, Do You Want To Change It Or Edit It!')
            return HttpResponseRedirect(reverse("new_topic_t", kwargs={'entry': searchPage}))
        else:
            return HttpResponseRedirect(reverse("new_topic_t", kwargs={'entry': searchPage}))
    else:
        title = request.POST["title"]    
        content = request.POST["text"]
        util.save_entry(title, content)
        return HttpResponseRedirect(reverse("generate_page", kwargs={'entry': title}))

forms.py

class newTitle(forms.Form):
    title = forms.CharField(label='New Page Title', max_length=100, widget=forms.TextInput(
        attrs={
            'id': 'titleCheck',
            'class': 'search', 
            'type': 'text',
            'placeholder': 'Type Topic Title Here...',
            'onblur': 'blurFunction()',
            'value': ''
        }))
    
    text = forms.CharField(label='Enter Page Text', widget=forms.Textarea(
        attrs={
            'id': 'NewTopicText',
            'class': 'form-control',
            'rows': '14'
        }))

你可以这样使用:

def save(request):
    if request.method == "GET":
        searchPage = request.GET.get('title','')  # consider using snake_case
        if(util.get_entry(searchPage) is not None):
            messages.info(request, 'The Page '  + searchPage +   ' Already Exists, Do You Want To Change It Or Edit It!')
            return HttpResponseRedirect(reverse("new_topic_t", kwargs={'entry': searchPage}))
        else:
            form = newTitle() # consider using PascalCase
            return render('createNewPage.html', context={'newText_form': form})
    else:
        form = newTitle(request.POST)
        if form.is_valid():
           title = form.cleaned_data["title"]    
           content = form.cleaned_data["text"]
           util.save_entry(title, content)
           return HttpResponseRedirect(reverse("generate_page", kwargs={'entry': title}))
        else:
            return render('createNewPage.html', context={'newText_form': form})  # will render errors in the html page

仅供参考,根据PEP-8 指南,您应该将变量和方法命名为 snake_case,Class 命名为 PascalCase。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM