2017-02-26 9 views
0

私はローカルハイキングをカタログ化するウェブサイトを持っています。ユーザーは、これらのハイキングを完了したことを「ログ」することができます。私はこれらのモデル+フォームの両方を意図どおりに動作させています。現在、ハイキングを記録するには、データベースのすべてのハイキングを含む長いリストからハイキングを選択する必要があります。そのフィールドにあらかじめ入力して、そのハイキングの詳細ページから来ている場合は、そのフィールドにハイキングを記入してください。ここで参照URLに基​​づいてModelFormフィールドを事前入力してください

は、いくつかのコードです:

models.py:

model Hike(models.Model): 
    name = CharField(max_length=255) 
    slug = models.SlugField(unique=True) 
    ...other fields... 

model UserLog(models.Model): 
    hike = models.ForeignKey(Hike, on_delete=models.CASCADE) 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 

forms.py:

class LogHike(forms.ModelForm): 
    class Meta: 
     model = UserLog 
     fields = ('hike', 'date', ... other fields) 

views.py:

def hike_detail(request, slug): 
    hike = Hike.objects.get(slug=slug) 
    log = UserLog.objects.filter(hike__slug=slug) 
    ... more stuff here ... 
    return render(request, 'hikes/hike_detail.html' { 
     'hike': hike, 
     'log': log, 
}) 

def log_hike(request): 
    if request.method == "POST": 
     form = LogHike(request.POST) 
     if form.is_valid(): 
      obj = form.save(commit=False) 
      userid = request.user 
      obj.user = request.user 
      obj.save() 
      return redirect('user_profile', uid=userid.id) 
    else: 
     form = LogHike() 
    return render(request, 'log_hike.html', {'form': form}) 

だから、ユーザーがある場合「hike_detail」ビューを表示すると、hしたいそれらを "log_hike"ビューに送信するが、そこから来た "Hike"に基づいて "Hike"フィールドがあらかじめ設定されているリンクを使用してください。私はそれがインスタンス関数と何か関係があるかもしれないと思いますか?しかし、私はそれに多くの経験がありません。フォームをあらかじめ入力するために参照ページからデータを渡す簡単な方法はありますか?

答えて

1

request.methodgetの場合は、postの場合と同じ方法で、そのフォームをlog_hikeに事前入力することができます。

form = LogHike({'hike':hike_id}) 

他の事はあなたがhike_idを取るよフォームです。しかし、それは例えばrequest.GETから来ることができます。あなたはおそらくあなたのModelForm__init__方法オーバーライドしたい

+0

これは機能しました!ありがとう!参照リンクをGETフォームとして設定し、そのようにIDを渡す必要がありました。 – Josh

2

def __init__(self, *args, **kwargs): 
    super(LogHike, self).__init__(*args, **kwargs) 
    if 'hike' in kwargs: 
     self.fields['hike'].value = kwargs['hike'] 

をあなたが必要とするすべては、渡されたパラメータを受け入れ、あなたが設定されている別の図です。そのため、あなたのurls.pyを拡張し、ような何か、その後:

def log_hike_with_pre_set_hike(request, *args, **kwargs): 
    if request.method == 'POST': 
     # see your code 
    else: 
     form = LogHike(hike=kwargs['hike']) 
    return render(request, 'log_hike.html', {'form': form}) 

未テストコードを、あなたはそれを適応させる必要がある場合がありますそれはあなたのために異なる場合がありますので、私はクラスベースのビューから来ます。

+0

'__init__'メソッドをオーバーライドする必要はないと思います。最初のパラメータは' data'です。これは、 'POST'のために使用したときと同じように、まったく使用されません。 – McAbra

+0

他のオプションもうまくいきましたが、これはやっかいなことでした。ご協力いただきありがとうございます! – Josh

関連する問題