基于引用URL预填充ModelForm字段

2024-09-24 22:32:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个网站,目录本地徒步旅行。用户可以“记录”他们已经完成了这些远足。我有这两个模型+形式的预期工作。不过,现在,为了记录一次远足,您必须从一个包含数据库中所有远足的长列表中选择远足。我希望能够预先填充该字段,以便如果您来自有问题的远足的详细信息页面,那么该字段将填充远足

下面是一些代码:

型号.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)

表单.py:

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

视图.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\u detail”视图,我希望有一个链接可以将他们发送到“log\u hike”视图,但是“hike”字段是根据他们来自的“hike”预先填充的。我想可能和实例函数有关吧?但我没有太多的经验。有没有一种简单的方法从引用页面传递数据,以便预先填充表单


Tags: pyformlog视图fieldsmodelmodelsrequest
2条回答

request.methodget时,可以在log_hike中预填充该表单,方法与在post中时相同

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

另一件事是形式,你将采取hike_id。但这可以来自request.GET例如

您可能希望重写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})

未经测试的代码,您可能必须对其进行调整,我来自基于类的视图,因此对您来说可能会有所不同

相关问题 更多 >