我正在创建一个项目:
forms.py
class InputForm(forms.Form):
user_input = forms.CharField(max_length=50, label="")
random_url = forms.CharField(initial=uuid.uuid4().hex[:6].upper())
models.py
class AddToDatabase(models.Model):
user_input = models.CharField(max_length=50, unique=True)
random_url = models.CharField(max_length=10, unique=True)
views.py
def Home(request):
if request.method == 'POST':
form = InputForm(request.POST)
if form.is_valid():
user_input = request.POST.get('user_input', '')
random_url = request.POST.get('random_url', '')
data = AddToDatabase(user_input=user_input, random_url=random_url)
data.save()
return render(request, 'index.html', {'form':form})
else:
form = InputForm()
return render(request, 'index.html', {'form':form})
的index.html
<form action="" method="POST">
{{form}}
{% csrf_token %}
<input type="submit">
</form>
我是Python / Django的新手,这可能是显而易见的。上面的代码允许用户提交成功添加到数据库的输入。它还会生成6个随机字符并将其添加到数据库中。
问题是我不知道如何将该随机代码转换为URL并在提交表单后将用户重定向到那里。
到目前为止,我已经尝试了几种方法,例如将action="{{ random_url }}"
添加到index.html
表单,以及将url(r'(?P<random_url>\d+)', views.Home, name='home')
添加到urls.py
答案 0 :(得分:0)
我建议您使用Hashids之类的内容代替uuid.uuid4()[:6]
,但我认为您的问题出在urls.py
:
url(r'(?P<random_url>\d+)', views.Home, name='home')
此处random_url
的正则表达式为\d+
。 \d+
matches one or more decimal digits,但uuid.uuid()[:6]
生成的值不是小数。我认为\w
会更合适。
另一个问题是views.Home
不接受“随机网址”,因此它永远不知道要显示哪一个。给它第二个论点:
def Home(request, random_url=None):
然后在random_url
内使用Home
从数据库加载正确的页面。我怀疑这应该发生在一个新的视图函数中,但我不清楚每个页面代表什么,所以我不能推荐一个好名字。
答案 1 :(得分:0)
models.py
import uuid
class AddToDatabase(models.Model):
user_input = models.CharField(max_length=50, unique=True)
random_url = models.UUIDField(default=uuid.uuid4)
forms.py
from .models import AddToDatabase
class InputForm(forms.ModelForm):
class Meta:
model = AddToDatabase
fields = ["user_input"]
views.py
from django.shortcuts import redirect
def Home(request):
form = InputForm()
if request.method == 'POST':
form = InputForm(request.POST)
if form.is_valid():
form_instance = form.save(commit=False)
form_instance.save()
return redirect("form_detail", random_url=form_instance.random_url)
return render(request, 'index.html', {'form':form})
def form_detail(request, random_url):
template = "form_detail.html"
context = {}
form_detail = get_object_or_404(AddToDatabase, random_url=random_url)
context["form_detail"] = form_detail
return render(request, template, context)
urls.py
from . import views
urlpatterns = [
url(r'^home/$' views.Home, name="home"),
url(r'^form-detail/(?P<random_url>[-\w]+)/$', views.form_detail, name="form_detail")
]
在form_detail.html模板
中<div>
<p> User Input : {{ form_detail.user_input }}</P>
</div>