Python 将额外参数与request.POST一起传递给Django模型表单

Python 将额外参数与request.POST一起传递给Django模型表单,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我有一个带有一些字段的评级模型,其中包括ip和url以及必填字段。 我在request.POST中获得了其中一些字段,但我必须从视图中将ip和url传递给模型表单。 我的模型: class Rating(models.Model): rating = core_fields.SmallIntegerRangeField(min_value=1, max_value=5) url = models.URLField(max_length=2048) tracker = m

我有一个带有一些字段的评级模型,其中包括ip和url以及必填字段。 我在request.POST中获得了其中一些字段,但我必须从视图中将ip和url传递给模型表单。 我的模型:

class Rating(models.Model):

    rating = core_fields.SmallIntegerRangeField(min_value=1, max_value=5)
    url = models.URLField(max_length=2048)
    tracker = models.ForeignKey("core.Tracker", db_index=True)
    ip = models.GenericIPAddressField(db_index=True)
    user_agent = models.CharField(max_length=100)
    object_id = models.PositiveIntegerField(db_index=True)
   _content_type = models.ForeignKey(ContentType, db_index=True)
   special_object = GenericForeignKey('_content_type', 'object_id')

class Meta:
    unique_together = ['_content_type', 'tracker', 'object_id']
    verbose_name = ('rating')
在my views.py中:

form = RatingModelForm(request.POST, ip=ip, url=url)

if form.is_valid():
    instance = form.save(commit=False)
    instance.save()
以及我在forms.py中的权限:

class RatingModelForm(forms.ModelForm):

    class Meta:
        model = Rating
        exclude = ('special_object',)

    def __init__(self, *args, **kwargs):
        ip = kwargs.pop('ip', None)
        url = kwargs.pop('url', None)

        super(RatingModelForm, self).__init__(*args, **kwargs)
        self.fields['ip'].initial = ip
        self.fields['url'].initial = url

我尝试过设置初始值,但表单.is_valid()给出了False,并声明需要ip和url。如何进行此操作?

ModelForm的第一个参数是数据。即表单的预期数据。正如您提到的,
request.POST
是一个不可变的查询信息。制作一本新词典,方法是制作一个,修改它,然后将其传递到表单中

如果在django QueryDict上使用dict(),它看起来会很奇怪。因此,您必须复制查询dict以使其正常工作

data = request.POST.copy()
data['ip'] = ip
data['url'] = url
form = RatingModelForm(data) 

谢谢你的回答,但是对于我来说request.POST是一个不可更改的查询信息。不能修改that@roushankumar我修改了我的答案。@roushankumar有帮助吗?是的,有。。谢谢你的回答。另外,如果您能帮助我在我希望将额外参数与request.post一起传递到表单时如何继续,那将是非常好的。我们必须为此重写任何表单方法吗?您不需要重写任何表单方法。在您获取
request.POST的视图中
您可以像上面那样将ip和url存储在字典中。然后把字典传给表格。当您验证表单时,它应该是有效的,对吗?或者你还有别的问题吗?