如何将 url 打印到我的 Django 表单的订单 ID 字段?

How can I print the url to the order id field of my django form?

我正在用 Django 做一个简单的表单站点。这是我的网站 url 的样子:mysite.com/register/12345678 我想将寄存器(12345678)之后的部分打印到订单ID字段。当有人访问这个 mysite.com/register/87654321 url 时,我想打印它。 我怎样才能做到这一点?这些是我的代码。(目前使用 Django 1.11.10)

forms.py

from django import forms
from .models import Customer
from . import views

class CustomerForm(forms.ModelForm):

    class Meta:
        model = Customer
        fields = (
        'order_id','full_name','company','email',
        'phone_number','note')

        widgets = {
            'order_id': forms.TextInput(attrs={'class':'orderidcls'}),
            'full_name': forms.TextInput(attrs={'class':'fullnamecls'}),
            'company': forms.TextInput(attrs={'class':'companycls'}),
            'email': forms.TextInput(attrs={'class':'emailcls'}),
            'phone_number': forms.TextInput(attrs={'class':'pncls'}),
            'note': forms.Textarea(attrs={'class':'notecls'}),

        }

views.py

from django.shortcuts import render
from olvapp.models import Customer
from olvapp.forms import CustomerForm
from django.views.generic import CreateView,TemplateView


def guaform(request,pk):

    form = CustomerForm()

    if request.method == "POST":
        form = CustomerForm(request.POST)

        if form.is_valid():
            form.save(commit=True)

        else:
            print('ERROR FORM INVALID')

    theurl = request.get_full_path()
    orderid = theurl[10:]

    return render(request,'forms.py',{'form':form,'orderid':orderid})

customer_form.html

{% extends 'base.html' %}

{% block content %}

<h1>REGİSTRATİON</h1>

<form class="registclass" method="POST">
  {% csrf_token %}
  {{ form.as_p }}

  <button type="submit" class="btn btn-default">REGISTER</button>

</form>

{% endblock %}

urls.py

from django.conf.urls import url
from django.contrib import admin
from olvapp import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^thanks/$',views.ThankView.as_view(),name='thank'),
    url(r'^register/(?P<pk>\d+)',views.guaform,name='custform'),

]

您已将值作为 'pk' 传递给您的视图,因此您可以使用它来设置初始值:

views.py

form = CustomerForm(initial={'order_id': pk})

SamSparx 是对的,这里有一些额外的信息可以帮助提前防止此类错误:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^thanks/$',views.ThankView.as_view(),name='thank'),
    url(r'^register/(?P<pk>\d+)',views.guaform,name='custform'),
]

您正在使用正则表达式来解析您的路径。根据 the docs,一般来说在这种情况下不推荐使用 Regex,因为它可能会引入更多错误并且更难调试。 (未优化)RegEx 也往往更慢。

对于简单的用例,例如此处的路径,请考虑选择如下默认路径语法:

urlpatterns = [
    url('admin/', admin.site.urls),
    url('thanks/',views.ThankView.as_view(),name='thank'),
    url('register/<int:pk>',views.guaform,name='custform'),
]

你当然也可以使用 string 而不是 int,这取决于你对 pk 的使用。

您的路径并非始终以斜杠结尾。这可能会影响您的 SEO 并使用户感到困惑。参见 this and this

此外,您的表单未导入。as_view() 出于某种原因,这可能会导致一些问题。