2017-04-23 86 views
1

我创建如果一个项目:在Django中创建随机URL?

  1. 一个用户提交一个输入到表格
  2. 这数据输入到生成一个随机URL数据库
  3. (认为imgur/YouTube的链接样式)
  4. 用户被重定向到该随机URL
  5. 输入数据是对随机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<random_url>\d+)', views.Home, name='home')urls.py

+0

请注意, “6字UUID” 不是一回事。你正在做的是生成一个UUID,然后从它的前6个字符。这比产生适当的UUID更容易产生冲突。 – Chris

+0

理解和编辑,谢谢! – Liam

+0

如果您正在使用UUID,请记住它带有'-'字符。你(可能)想要替换它。 – SarTheFirst

回答

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"] 

意见。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> 
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不接受“随机URL”,所以它永远不知道要显示哪一个。给它一个第二个参数:

def Home(request, random_url=None): 

然后用random_urlHome从数据库加载正确的页面。我怀疑这应该发生在一个新的视图功能,但我不清楚每个页面代表什么,所以我不能推荐一个好的名字。

+0

问题是'def Home'用于显示主页(index.html - mydomain.com)和表单,所以我不能为此更改'urls.py'。如果我创建了另一个Django应用程序,那么我不确定我为HTML格式“action =”...“'添加了什么工作 – Liam

+0

再次,我不确定对这两种情况使用相同的视图是有道理的,但你可以使'random_url'参数成为可选的,正如我在更新后的答案中所显示的那样。 (注意:你可能想要将'random_url'重命名为'slug',这是一个相当常见的术语,在我看来,“random”在这里并不适用。) – Chris

+0

已更改,谢谢您!你知道我是否需要在''中添加一些内容到'action'中? – Liam