Python 在Django ModelForm中传递相关对象的字段
我有一个Django模型类,它扩展了Django.contrib.auth.models.User: 从这个模型中,我制作了一个模型:Python 在Django ModelForm中传递相关对象的字段,python,django,Python,Django,我有一个Django模型类,它扩展了Django.contrib.auth.models.User: 从这个模型中,我制作了一个模型: class MyModelForm(forms.ModelForm): class Meta: model = MyModel fields = ['bio', 'date_of_birth'] 我如何告诉MyModelForm接受用户字段,如用户名、名字、姓氏 例如,在类元字段中,我可以添加['bio'、'date\u of\u bir
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['bio', 'date_of_birth']
我如何告诉MyModelForm接受用户字段,如用户名、名字、姓氏
例如,在类元字段中,我可以添加['bio'、'date\u of\u birth'、'user'],但这将为我提供一个下拉列表,以选择MyModelForm中的MyModel与谁相关
执行['bio'、'date\u of\u birth'、'user.first\u name']操作会引发异常django.core.exceptions.FieldError:为MyModel指定的未知字段user.first\u name
编辑:这是回溯
您可以使用。这里我发布了一个我使用的代码示例,可能会对您有所帮助。我已经根据你的需要做了一些修改,所以如果有什么不好的地方,请告诉我
#forms.py
class UserForm(forms.ModelForm):
class Meta:
model = User
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
那么在你看来你应该像
def profileEdit(request,username):
# querying the User object with pk from url
user = User.objects.get(username=username)
# prepopulate MyModelForm with retrieved user values from above.
user_form = UserForm(instance=user)
MyModelInlineFormset = inlineformset_factory(User, MyModel,can_delete=False, fields="__all__")
formset = MyModelInlineFormset(instance=user)
if request.user.is_authenticated() and request.user.id == user.id:
if request.method == "POST":
user_form = UserForm(request.POST, request.FILES, instance=user)
formset = MyModelInlineFormset(request.POST, request.FILES, instance=user)
if user_form.is_valid():
created_user = user_form.save(commit=False)
formset = MyModelInlineFormset(request.POST, request.FILES, instance=created_user)
if formset.is_valid():
created_user.save()
formset.save()
return HttpResponseRedirect('/')
return render(request, "profile_edit.html", {
'title':'Edit -'+ user.get_full_name(),
"user_form": user_form,
"formset": formset,
})
else:
raise PermissionDenied
在您的个人资料中_edit.html
{% extends "layout.html" %}
{% block content %}
{% if messages %}
<div>
{% for message in messages %}
<div class="alert alert-{{ message.tags }}"> <!-- singular -->
<a class="close" data-dismiss="alert">×</a>
{{ message|safe }}
</div>
{% endfor %}
</div>
{% endif %}
<div class="col-xs-8 col-xs-offset-2">
<div class="card">
<div class="card-content">
<h2 class="flow-text">Update your information</h2>
<form action="." method="POST" class="padding" enctype="multipart/form-data">
{% csrf_token %}
{% for field in user_form %}
<div class="form-group">
{{ field.errors }}
<label for="{{ field.label }}" >{{ field.label }}</label>
{{ field }}
{% if field.help_text %}
<small class="form-text text-muted">{{ field.help_text|safe }}</small>
{% endif %}
</div>
{% endfor %}
{{ formset.management_form }}
{% for form in formset %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
<div class="form-group">
{{ field.errors }}
<label for="{{ field.label }}" >{{ field.label }}</label>
{{ field }}
{% if field.help_text %}
<small class="form-text text-muted">{{ field.help_text|safe }}</small>
{% endif %}
</div>
{% endfor %}
{% endfor %}
<input type="submit" class="btn btn-primary" value="Save"></input>
</form>
</div>
</div>
</div>
{% endblock content %}
我通过重写ModelForm的_init__方法找到了自己的解决方案: 当我实例化我的表单时,我只是将MyModel的一个实例作为
kwarg:form=MyModelForminstance=my_model_instance嘿,你可以通过添加双下划线和相关模型字段名来添加相关字段,如用户用户名等。仍然抛出字段错误,未知字段例外请发布错误?还是回溯?使用回溯编辑它添加了一个代码示例作为我使用的答案,这让我忽略了Django不提供任何默认的表单处理方式。我很高兴您找到了解决问题的方法:在super.\uuu init\uuuuu之后,设置self.instance,因此,您可以使用my_user=self.instance,这比从kwargs中获取要容易一些。@dirkgroten哦,非常感谢:我对django/python非常陌生,所以很多微妙之处我都不知道
{% extends "layout.html" %}
{% block content %}
{% if messages %}
<div>
{% for message in messages %}
<div class="alert alert-{{ message.tags }}"> <!-- singular -->
<a class="close" data-dismiss="alert">×</a>
{{ message|safe }}
</div>
{% endfor %}
</div>
{% endif %}
<div class="col-xs-8 col-xs-offset-2">
<div class="card">
<div class="card-content">
<h2 class="flow-text">Update your information</h2>
<form action="." method="POST" class="padding" enctype="multipart/form-data">
{% csrf_token %}
{% for field in user_form %}
<div class="form-group">
{{ field.errors }}
<label for="{{ field.label }}" >{{ field.label }}</label>
{{ field }}
{% if field.help_text %}
<small class="form-text text-muted">{{ field.help_text|safe }}</small>
{% endif %}
</div>
{% endfor %}
{{ formset.management_form }}
{% for form in formset %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
<div class="form-group">
{{ field.errors }}
<label for="{{ field.label }}" >{{ field.label }}</label>
{{ field }}
{% if field.help_text %}
<small class="form-text text-muted">{{ field.help_text|safe }}</small>
{% endif %}
</div>
{% endfor %}
{% endfor %}
<input type="submit" class="btn btn-primary" value="Save"></input>
</form>
</div>
</div>
</div>
{% endblock content %}
class MyModelForm(forms.ModelForm):
first_name = forms.CharField()
class Meta:
model = MyModel
fields = ['bio', 'date_of_birth']
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
my_user = kwargs.get('instance')
first_name = my_user.user.first_name
self.fields['first_name'].initial = first_name #this will show the first name in the html page when i request the instance