【问题标题】:Django saving choices valuesDjango 保存选择值
【发布时间】:2016-07-27 04:59:01
【问题描述】:

我想在模型中保存选定的选项。 我想使用 Select 小部件进行选择。 我有一个模型:

qobj = Model1.objects.all()

CHOICE = (
    (x.id, x.name) for x in qobj
)

class Model2(models.Model):
    choice_field = models.CharField("CHOICE", max_length=77, choices=CHOICE)

我得到了错误:“选择一个有效的选择。5 不是可用的选择之一。” - 尝试保存时出错。 我尝试forms.ModelChoiceField(queryset=qobj) - 没问题,但我无法获得Model.get_choice_field_display()。 可能有人知道解决这个问题吗?

【问题讨论】:

  • MyModel 是“空”是什么意思?
  • 就目前的.html 而言,您并没有使用datename,因此您可以删除这些行。
  • 空是我没有发送表单并且更改列表是空的
  • preview.html 的内容是什么...是在表单保存之后直接呈现的(不是通过preview() 视图?)即return render(request, 'WebMamOffice/en/preview.html')
  • 您可以等到得到有效的答案后再将答案标记为正确! ;) 就目前而言,我们的答案都没有明显解决您的问题。

标签: python django


【解决方案1】:

问题出在这里:

def preview(request):
    form = MyModelForm()
    date = MyModel.objects.order_by('date')[0]
    name = MyModel.objects.order_by('name')[0]

您正在查询对象、排序和获取第一个项目。但是,如果没有项目,则无法执行此操作。请改用.first(),例如

    date = MyModel.objects.order_by('date').first()
    name = MyModel.objects.order_by('name').first()

这将返回第一项,如果有的话,或者None 如果没有。请参阅the documentation 了解更多信息。也有一些 other examples in this question 提供替代方法来处理这个问题。

但是,我建议您不要使用这种方法。当您保存新对象 (form01.save()) 时,这将返回新创建的对象。然后,您可以直接访问它以进行预览。例如:

preview_model = form01.save()

当另一个用户在.save() 和选择之间编辑另一个对象时,使用MyModel.objects.order_by('date').first() 获取“最新记录”会给您带来竞争条件。

我不确定name = MyModel.objects.order_by('name').first() 的用途,因为这将返回一个与前一位完全不同的对象(第一个对象按字母顺序排序) - 我无法想象你为什么会想要那个。在views.py 中尝试以下操作:

def form1(request):
    form = MyModelForm()
    if request.method == 'POST':
        form01 = MyModelForm(request.POST, request.FILES)
        if form01.is_valid():
           preview = form01.save()
           date = preview.date
           return render(request, 'WebMamOffice/en/preview.html', {'form': form01, 'date': date, 'name': name})
    return render(request, 'WebMamOffice/en/form1.html', {'form': form})

【讨论】:

  • 但我查询表单何时保存
  • ('date')[0] 在模板#2 中查询 dfate 时存在
  • @VolodymyrKirichinets 很高兴你得到了这个排序,但看到编辑 - 我认为有一个更简单的方法来做你想做的事。
  • 这个问题解决了。但现在有其他的。我想通过 id 为下一个模板获取已保存表单的值,然后进行一些更新。并且无法选择最方便的变体。
【解决方案2】:

您的preview() 视图假定至少存在一个MyModel 实例:您正在访问MyModel.objects.blah[0],这仅在[0] 有内容时才有效。

【讨论】:

  • 我在 form.save() 之后使用 date[0] 换句话说 date[0] 在理论上是存在的
【解决方案3】:

错误在这里:

date = MyModel.objects.order_by('date')[0]
name = MyModel.objects.order_by('name')[0]

MyModel.objects.order_by('date') 返回一个 QuerySet,如果 queryset 为空,则它没有索引 '[0]'。试试 'first()' 而不是 [0]:

date = MyModel.objects.order_by('date').first()
name = MyModel.objects.order_by('name').first()

案例MyModel为空,先返回None 文件: https://docs.djangoproject.com/en/1.9/ref/models/querysets/#first

【讨论】:

  • 我在form.save()之后在form#2中查询日期
  • 知道了,检查你的代码,看到你没有重定向到预览,所以试试:redirect('preview') intead render(request, 'WebMamOffice/en/preview.html') @ 987654322@
  • 很遗憾,重定向列表索引超出范围。我不明白,我在获取数据 [0] 之前调用了 form.save(),为什么会出现这个错误。如果我有一个保存的对象,其他进展顺利,我可以获得刚刚保存的表格的日期[0]。
  • 你覆盖了'save'方法还是默认的?
  • 默认值。在我的其他模型中,这种结构运行良好。
【解决方案4】:

这个问题在 django 中部分解决了不能保存模型选择选择的值

【讨论】:

    【解决方案5】:

    ManyToManyField 的最佳使用方式:

    class Model2(models.Model):
        choice_field = models.ManyToManyField(to=Model1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多