Фактическое значение Django в форме поля выбора

#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})