Django保存选择值

时间:2016-04-06 16:32:42

标签: python django

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

qobj = Model1.objects.all()

选择=(     (x.id,x.name)for q 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()。 可能有人知道解决这个问题吗?

5 个答案:

答案 0 :(得分:2)

错误在这里:

/**
* Writes midi data to the Sonivox synthesizer. 
* The length of the array should be the exact length 
* of the message or messages. Returns true on success, 
* false on failure.
*/

boolean write(byte buffer[])  

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

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

Case MyModel为空,首先返回None 文档: https://docs.djangoproject.com/en/1.9/ref/models/querysets/#first

答案 1 :(得分: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()

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

我不确定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})

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

使用ManyToManyField的最佳方式:

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