2017-02-26 61 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」視圖,但是基於它們來自的「遠足」預先填充了「遠足」字段。我認爲這可能與實例功能有關?但我沒有很多的經驗。有沒有簡單的方法來傳遞引用頁面中的數據以預先填充表單?

回答

1

request.methodget時,您可以使用與post中相同的方式在log_hike中預先填寫該表單。

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

另一件事是形式,在那裏你會採取hike_id。但是,這可能來自request.GET

+0

這工作!謝謝!我必須將引用鏈接設置爲GET表單,並以這種方式傳遞ID。 – Josh

2

你可能要覆蓋ModelForm__init__方法:

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