Reputation: 165
I am new to django and building an user (named "Developer") settings update page. I used model form and passed the settings instance via views.py hoping them to show up in the rendered template for users (named "Developer") to edit. But the instance value is not populated into the template in form.as_p.
I have tested the {{project_form.instance.pk}} is passing the correct project instance, so I am expecting the project name to show up as default value in the form for user input project name, but it is showing blank.
models.py (simplified)
class Project(models.Model):
project_name = models.TextField(unique=True)
class Developer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
project = models.ForeignKey(Project, on_delete=models.CASCADE, default=Project.get_default_project)
institution = models.ForeignKey(Institution, on_delete=models.CASCADE, null=True, blank=True)
forms.py
class ProjectForm(ModelForm):
class Meta:
model = Project
fields = ['project_name']
views.py
def developerSettingsUpdate(request):
from .forms import ProjectForm
developer = request.user.developer
project = developer.project
if request.method == 'POST':
project_form = ProjectForm(request.POST, instance=project)
if project_form.is_valid():
project_form.save()
else:
project_form = ProjectForm(instance=project)
return render(request,
'decg/developer_settings.html',
{
'project_instance': project,
'project_form': project_form,
})
developer_settings.html
<div>
<h5>Expecting this field to show instance: {{ project_form.instance.project_name }}</h5>
</div>
<form method="post">
{% csrf_token %}
{{ project_form.as_p }}
<button class="button" type="submit">Update</button>
</form>
But it is showing blank: see Screenshot of rendered developer_settings.html
:
see Screenshot of rendered developer_settings.html
Upvotes: 1
Views: 865
Reputation: 716
The problem lies in this code:
developer = request.user.developer
project = developer.project
Those variables must point to an actual model instance in order to populate the form like you did in project_form = ProjectForm(instance=project)
. It should be something like this:
developer = Developer.objects.filter(user=request.user.developer)
project = Project.objects.filter(project_name=request.user.developer)
Upvotes: 2