【问题标题】:Pass extra parameters to Django Model Forms along with request.POST将额外参数与 request.POST 一起传递给 Django 模型表单
【发布时间】:2017-09-10 06:27:18
【问题描述】:

我有一个评级模型,其中包含一些字段,其中 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')

在我的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

我尝试设置初始值,但 form.is_valid() 给出 False 并声明需要 ip 和 url。如何进行?

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    ModelForm 的第一个参数是数据。即表单的预期数据。正如您提到的,request.POST 是一个不可变的查询字典。通过创建copy out of it 创建一个新字典,对其进行修改,然后将其传递到表单中。

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

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

    【讨论】:

    • 感谢您的回答,但 request.POST 在我的情况下是一个不可变的查询字典。无法修改
    • @roushankumar 我修改了我的答案。
    • @roushankumar 有帮助吗?
    • 是的。谢谢你的回答。如果您能帮助我了解如何进行,以防我想将额外的参数与 request.post 一起传递给表单,那将是非常棒的。我们是否必须为此重写任何表单方法?
    • 您不需要重写任何表单方法。在您获得 request.POST 的视图中,您可以将 ip 和 url 存储在像上面这样的字典中。然后将字典传递到表单中。当您验证表单时,它应该是有效的,对吧?还是您还有其他问题?
    猜你喜欢
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2019-03-02
    • 2018-10-29
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2014-07-05
    相关资源
    最近更新 更多