2017-04-23 12 views
1

は私がプロジェクト作成しています:DjangoでランダムなURLを作成していますか?

  1. は、ユーザーがフォームに入力を提出し
  2. データが入力され、ランダムなURLが生成されたデータベース
  3. にされていること(imgur /ユーチューブスタイルのリンクを考えます)
  4. ユーザーが
  5. 入力データは、ランダム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> 

Iは、Python/Djangoのに新たなんです、おそらく明らかです。上記のコードは、ユーザーがデータベースに正常に追加された入力を提出することを可能にします。また、6つのランダムな文字を生成し、それをデータベースに追加します。

問題は、ランダムコードをURLに変換してフォームを送信した後にユーザーをリダイレクトする方法がわかりません。

私は私はあなたのURLの代わりに、uuid.uuid4()[:6]ためHashidsのようなものを使用することをお勧めします、このようなindex.htmlフォームにaction="{{ random_url }}"を追加するだけでなく、urls.py

+0

注意。あなたがやっていることは、UUIDを生成してから、最初の6文字を取り出すことです。これは、適切なUUIDよりも衝突を生成する可能性がはるかに高いです。 – Chris

+0

理解していただきありがとうございました! – Liam

+0

UUIDを取得している場合は、 '-'文字が戻ってくることに注意してください。あなたは(おそらく)それを置き換えたいだろう。 – SarTheFirst

答えて

0

from .models import AddToDatabase 
class InputForm(forms.ModelForm): 

    class Meta: 
     model = AddToDatabase 
     fields = ["user_input"] 

ビューforms.py models.py

import uuid 

class AddToDatabase(models.Model): 
    user_input = models.CharField(max_length=50, unique=True) 
    random_url = models.UUIDField(default=uuid.uuid4) 

。"6文字のUUIDが" ものではないことを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

url(r'(?P<random_url>\d+)', views.Home, name='home')を追加するなど、これまでの方法のカップルを試みたが、しましたrandom_urlのためのあなたの正規表現は\d+です。ここ

url(r'(?P<random_url>\d+)', views.Home, name='home') 

:私はあなたの当面の問題はurls.pyであると思います。 \d+ matches one or more decimal digitsですが、uuid.uuid()[:6]によって生成された値は小数ではありません。私は\wがより良くフィットすると思います。

もう1つの問題は、views.Homeが「ランダムURL」を受け入れないため、表示するものが決してないことです。

def Home(request, random_url=None): 

をして、データベースから正しいページをロードするためにHomerandom_urlを使用します。それを第二引数を与えます。私はこれが実際には新しいビュー機能で起こるはずだと思うが、私はそれが良い名前を推薦することはできませんので、各ページが何を表しているのか分かりません。

+0

問題は、 'def Home'がホームページ(index.html - mydomain.com)とフォームを表示するために使われているので、' urls.py'を変更できないということです。別のDjangoアプリケーションを作成した場合、htmlフォームに 'action =" ... "'を追加するとわかりません – Liam

+0

もう一度、これらの両方のケースで同じビューを使用しているかどうかはわかりません私の更新された答えに示されているように 'random_url'引数をオプションにすることができます。 (サイドノート: 'random_url'の名前を' slug'のように変更したいと思うかもしれませんが、これはかなり一般的な用語ですが、私の意見では "ランダム"は実際には適用されません) – Chris

+0

変更ありがとう君は!あなたが ''で 'action'に何かを追加する必要があるかどうか知っていますか? – Liam

関連する問題