Django ModelForm CharField更改为ModelChoiceField导致在编辑模式下未填充值

deikduxw  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(107)

我有一个模型,拥有CharField的所有者,应该“容纳”对象所有者的用户名。我使用ModelForm来创建表单,以创建对象,并在以后编辑它。现在,我希望这个所有者字段是一个选择字段,其中包含当前用户的用户名。这很容易通过添加owner = forms. ModelChoiceField...来完成。到ModelForm。这适用于创建新对象。
现在,当编辑(使用GET请求转到/{object_id}/edit链接)对象时,我使用对象示例调用ModelForm。所有的字段都被很好地填充,除了我的所有者字段,它只显示默认的'-----',你必须重新选择它。
我想要的是,该字段用当前的值填充,然后我可以根据当前用户的选择更改它。
先来回答这个问题:我不想让owner与user建立ForeignKey关系。
我的简化代码:

Model:
class MyObjects(models.Model):
    owner = models.CharField(max_length=1024, blank=True)

Form:
class MyModelForm(ModelForm):
    owner = forms.ModelChoiceField(queryset = User.objects.all().only('username')
    
    def __init__(self, *args, **kwargs):
        super().__init__.......
        <bunch of code for self.fields error messages>

Edit view:
def edit_myobjects(request, object_id):
     i = get_object_from_id(object_id)
     if request.method == "POST":
          do the  updating
     else:
          form = MyModelForm(instance=i)
     return render(request, 'template.html', {'i': i, 'form': form, 'mode': 'edit'})

已尝试上述操作,并预期编辑表单中的所有者字段已根据收到的对象进行填充。还尝试在视图中创建表单对象时输入initial,但这也没有显示任何结果:

form = MyModelForm(initial={'owner': i.owner}, instance=i)

尝试将初始值放在MyModelForm中的owner参数的原始创建中,但这显示列表的第一个选择始终作为初始值,而不是'------'或预期的实际值。
尝试将owner放入类型为str的TypedChoiceField中,但这也仅显示列表中的第一个值。
小编辑:当不指定owner作为ChoiceField时,它的工作方式与您预期的一样,但该字段只是一个打开的文本字段

z4iuyo4d

z4iuyo4d1#

经过更多的调试和随机尝试,我找到了一个解决方案,它结合了其他帖子上的一些答案。我可以为owner Select创建Widget,并在类 meta部分中给予选择(以前在init中尝试过,但没有工作,我认为这从代码流中是有意义的)。
现在的工作代码(改进这一点的意见总是赞赏!):

class Meta:
    owner_choices_base = User.objects.values_list('username', flat=True)
    owner_choices = [(c, c,) for c in owner_choices_base]
    owner_choices.insert(0, (None, None,))
    model = MyObjects
    widgets = {'owner': forms.Select(choices=owner_choices)}

相关问题