我有一个模型,拥有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时,它的工作方式与您预期的一样,但该字段只是一个打开的文本字段
1条答案
按热度按时间z4iuyo4d1#
经过更多的调试和随机尝试,我找到了一个解决方案,它结合了其他帖子上的一些答案。我可以为owner Select创建Widget,并在类 meta部分中给予选择(以前在init中尝试过,但没有工作,我认为这从代码流中是有意义的)。
现在的工作代码(改进这一点的意见总是赞赏!):