2017-02-26 82 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