#django #django-forms #foreign-keys
#django #django-forms #внешние ключи
Вопрос:
У меня есть такие модели:
class Projects(models.Model):
project = models.CharField(max_length=150, blank=True, null=True)
def __str__(self):
return self.project
class Profile(models.Model):
user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE)
project = models.ForeignKey(Projects, on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return self.user.username
Я также создал форму, в которой я хочу изменить текущий профиль, назначенный проекту:
class ProjectForm(ModelForm):
class Meta:
model = Profile
fields = [
'project'
]
Мое представление выглядит следующим образом:
def change_project(request, user):
user = User.objects.filter(username=user)[:1].get()
profile = Profile.objects.get(user=user)
form = ProjectForm(request.POST, instance=profile)
if request.method == 'POST':
if form.is_valid():
form.save()
context = {'form': form}
return render(request, 'datafiller/change_project.html', context)
Я могу изменить проект, используя эту форму, но каждый раз, когда я хочу сделать это снова, форма выглядит так
Как я могу показать в форме текущий проект вместо «——«?
Комментарии:
1. Вероятно, вам следует переименовать ProjectForm в profileForm или AssignProjectForm для ясности. Сбивает с толку вид профиля модели в форме проекта.
2. Да, вы правы. Это мой самый первый проект, и я постоянно что-то меняю, пытаясь понять, как они работают. Когда я уверен, что все в порядке, я переименовываю вещи, чтобы сделать их понятными. Может быть, это не лучший способ, но, как я уже сказал, я все еще учусь. Большое спасибо за ваш совет 🙂
Ответ №1:
Вы не должны заземлять ProjectForm
in, если вы отображаете форму с помощью GET requuest:
from django.shortcuts import get_object_or_404
def change_project(request, user):
profile = get_object_or_404(Profile, user__username=user)
if request.method == 'POST':
form = ProjectForm(request.POST, instance=profile)
if form.is_valid():
form.save()
else:
form = ProjectForm(instance=profile)
return render(request, 'datafiller/change_project.html', {'form': form})