在 Django 中创建随机 URL?

Posted

技术标签:

【中文标题】在 Django 中创建随机 URL?【英文标题】:Creating random URLs in Django? 【发布时间】:2017-09-20 12:27:18 【问题描述】:

我正在创建一个项目,其中:

    用户将输入提交到表单中 该数据被输入到数据库中 生成一个随机 URL(想想 imgur / youtube 风格的链接) 用户被重定向到该随机 URL 输入数据显示在该随机 URL 上

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&lt;random_url&gt;\d+)', views.Home, name='home')添加到urls.py

【问题讨论】:

请注意,“6 个字符的 UUID”不是一个东西。您正在做的是生成一个 UUID,然后从中获取前 6 个字符。这比正确的 UUID 更容易产生冲突。 理解和编辑,谢谢! 如果您使用 UUID,请记住它返回时带有 - 字符。您(可能)想要替换它。 【参考方案1】:

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>

【讨论】:

【参考方案2】:

我建议您在 URL 中使用 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 不接受“随机 URL”,因此它永远不知道要显示哪个。给它第二个参数:

def Home(request, random_url=None):

然后在Home 中使用random_url 从数据库中加载正确的页面。我怀疑这实际上应该发生在一个新的视图函数中,但我不清楚每个页面代表什么,所以我不能为它推荐一个好名字。

【讨论】:

问题是def Home 用于显示主页(index.html - mydomain.com)和表单,所以我不能为此更改urls.py。如果我创建另一个 Django 应用程序,那么我不确定要添加到 html 表单 action="..." 以使其正常工作 同样,我不确定对这两种情况使用相同的视图是否有意义,但您可以将 random_url 参数设为可选,正如我在更新的答案中所示。 (旁注:您可能希望将 random_url 重命名为 slug,这是此类事物的一个相当常见的术语。在我看来,“随机”在这里并不适用。) 已更改,谢谢!你知道我是否需要在&lt;form action=" " method="POST"&gt; 中向action 添加一些内容吗? @Liam,因为您正在回发到同一个 URL,所以您不需要设置 action。我猜你还有问题吗?你能详细说明一下吗? 现在整理好了,感谢您的帮助!

以上是关于在 Django 中创建随机 URL?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中创建随机整数列表

在 SQL Server 中创建生成随机数函数

在 OpenCV 中创建随机彩色图像

如何在 Python + Selenium 中创建随机用户代理?

在 Swift 中创建一个随机数数组

在打字稿中创建随机字符串[重复]