我有一个网站,列出当地的徒步旅行。用户可以" log"他们已经完成了这些徒步旅行。我有这两个模型+表格按预期工作。但是,现在,为了记录徒步旅行,您必须从包含数据库中所有徒步内容的长列表中选择徒步旅行。我希望能够预先填充该字段,这样如果您来自有问题的徒步旅行的详细信息页面,那么该字段就会被加息填充。
这里有一些代码:
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"看,我想有一个链接,将它们发送到" log_hike"观点,但与"远足"根据"远足"预先填充的字段他们来自。我认为它可能与实例函数有关?但我没有多少经验。是否有一种简单的方法可以从引用页面传递数据以预先填充表单?
答案 0 :(得分: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})
未经测试的代码,您可能需要对其进行调整,我来自基于类的视图,因此您可能会有所不同。
答案 1 :(得分:1)
当log_hike
为request.method
get
时,您可以使用与post
中相同的方式预先填充该表单。
form = LogHike({'hike':hike_id})
另一种形式是你将hike_id
的形式。但这可以来自request.GET
,例如。