Выдать форму предварительного заполнения в Django

#python #django #django-views #django-forms

Вопрос:

Я пытаюсь получить имя профиля пользователя для заполнения поля формы «пользователь»из формы » Повестка дня», но получаю «пользователь»: Нет». И, в представлениях, в следующих отпечатках:

             print(form.cleaned_data)
            print(initial_data)
 

Я получаю:

 {'user': None, 'date': datetime.date(2021, 9, 24), 'time': datetime.time(4, 0), 'comment': 'some comment', 'mode': 'ONLINE'}
{'user': <Profile: Jhon Doe>}
 

views.py

 @login_required(login_url='login')
@allowed_users(allowed_roles=['user'])
def agenda(request):
    user = request.user.profile
    initial_data = {
        'user': user
    }
 
    form = AgendaForm(initial=initial_data)

    if request.method == 'POST':
        form = AgendaForm(request.POST, initial=initial_data)
        if form.is_valid():

            form.save()

            print(form.cleaned_data)
            print(initial_data)

    context = {'form': form}
    return render(request, 'agenda.html', context)
 

agenda.models.py

 class Agenda(models.Model):
    user = models.ForeignKey(Profile, null=True, blank=True, on_delete=models.CASCADE)
    date = models.DateField(null=True, blank=True, default="1900-01-11")
      ...

    def __str__(self):
        return '%s' % (self.user)
 

main.models.py

 #(The OneToOneField 'User' comes from the UserCreationForm Django function)
class Profile(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    id = models.AutoField(primary_key=True, null=False, blank=True)
    first_name = models.CharField(max_length=50, null=True, blank=True)
       ...

    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)
 

Комментарии:

1. У request.POST вас был user пропуск?

2. Разве это не проходит с начальной диктовкой?

Ответ №1:

Объекты, которые вы передаете, initial используются только для отображения некоторых начальных значений, а не в качестве резервных/значений по умолчанию. Поэтому , если в нем нет user данных request.POST , по умолчанию None будет установлено значение .

Из docs :

Эти значения отображаются только для несвязанных форм и не используются в качестве резервных значений, если не указано конкретное значение. Это означает, что если в данных post нет пользователя, по умолчанию он будет None равен .

Если вы хотите установить agenda для пользователя FK профиль текущего пользователя, вы можете сделать:

     if request.method == 'POST':
        form = AgendaForm(request.POST, initial=initial_data)
        if form.is_valid():
            agenda = form.save(commit=False)
            agenda.user = request.user.profile
            agenda.save()