2017-04-23 40 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