根据引用URL预填充ModelForm字段

时间:2017-02-26 22:52:43

标签: python django

我有一个网站,列出当地的徒步旅行。用户可以" 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"观点,但与"远足"根据"远足"预先填充的字段他们来自。我认为它可能与实例函数有关?但我没有多少经验。是否有一种简单的方法可以从引用页面传递数据以预先填充表单?

2 个答案:

答案 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_hikerequest.method get时,您可以使用与post中相同的方式预先填充该表单。

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

另一种形式是你将hike_id的形式。但这可以来自request.GET,例如。