【问题标题】:Post additional model values to database in views.py not modelform在views.py而不是modelform中将其他模型值发布到数据库
【发布时间】:2017-11-18 18:52:20
【问题描述】:

型号

class Person(models.Model):
    first_name = models.CharField(blank=False,max_length=256,default='')
    last_name = models.CharField(blank=False,max_length=256,default='')
    plan = models.CharField(blank=False,max_length=256,default='')   
    plan_price = models.CharField(blank=False,max_length=256,default='')

Views.py

if request.method == 'POST':

    if form.is_valid():
        form.save(commit=True)
        return index(request)

在我的 modelForm 中,我接受来自用户的 3 个值:first_name、last_name 和 plan。我从表单发布到数据库没有任何问题,我想知道的是我怎么能说这样的话

if plan = 'plan1':
    #set plan_price to '$399'
else
    #set plan_price to '$699'

#then post first_name, last_name, plan, plan_price to database

【问题讨论】:

  • 您有从计划到价格的修复映射吗?

标签: python django django-models django-forms django-views


【解决方案1】:

您可以尝试以下方法:

if form.is_valid():
    person = form.save(commit=False)
    plans = {
        'plan1': 399,
        'plan2': 699,
        # ...
    }
    person.plan_price = plans.get(person.plan, some_default)
    person.save()
    return index(request)  
    # you might consider a redirect instead so as not to have the same content on various urls

如果计划价格始终与计划相匹配,您还可以覆盖模型的 save 方法并保持原来的视图:

class Person(models.Model):
    # ...
    def save(self, *args, **kwargs):
        self.plan_price = some_logic(self.plan)
        super(Person, self).save(*args, **kwargs)

但是,您可以将该字段全部替换为一个属性,因为这似乎是多余的。例如,如果计划更改价格,我会考虑使用带有名称和价格字段的 Plan 模型。

【讨论】:

  • 这非常有效,谢谢。实际上,我将两个答案放在一起以获得最终的工作代码。非常感谢!
【解决方案2】:

在您的 createview 中,您可以使用此函数并在那里编写代码

    def form_valid(self, form):
        if self.object.plan = 'plan1':
            form.instance.price = 399
        else:
            [...]
        return super(your_class_name, self).form_valid(form)

您可以通过self.object.filed访问创建的对象字段

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2013-08-15
    • 2020-01-23
    • 2020-07-03
    • 2020-06-27
    相关资源
    最近更新 更多