在Django中创建随机URL?

时间:2017-04-23 23:33:04

标签: python django database forms url

我正在创建一个项目:

  1. 用户将输入提交到表单
  2. 该数据输入数据库
  3. 生成随机网址(想想imgur / youtube样式链接)
  4. 用户被重定向到该随机网址
  5. 输入数据显示在该随机网址
  6. 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

2 个答案:

答案 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>