Django 2 request.POST не сохраняется в базе данных с instance = request.user - PullRequest
0 голосов
/ 13 марта 2019

У меня есть форма, в которой пользователь может отправить текст, который затем сохраняется в модели TextSubmission.

Тем не менее, он сохраняется только при извлечении instance=request.user из views.py и не сохраняется с экземпляром пользователя, который его отправил.

Если я оставлю instance=request.user в, объект request.POST не будет сохранен, но будет опубликован. (Я вижу из print(request.POST)

Может кто-нибудь помочь мне понять, почему это так и как получить текст для сохранения вместе с пользователем?

models.py

class TextSubmission(models.Model):
    text_submission    = models.CharField(max_length=50, null=True, blank=True)
    user                   = models.OneToOneField(User, on_delete=models.CASCADE)

    class Meta:
        ordering = ['text_submission']

    def __str__(self):
        return self.text_submission

forms.py

class TextSubmissionForm(forms.ModelForm):

    class Meta:
        model = TextSubmission
        fields = ['text_submission']

views.py

def profile_view(request):
    if request.method == 'POST':
        p_form = ProfileUpdateForm(request.POST, instance=request.user)
        t_form = TextSubmissionForm(request.POST, request.FILES, instance=request.user.profile)

        if p_form.is_valid() and t_form.is_valid():
            p_form.save()
            t_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')

    else:
        p_form = ProfileUpdateForm(instance=request.user.profile)
        t_form = TextSubmissionForm(instance=request.user.textsubmission)

    context = {
        'p_form': p_form,
        't_form': t_form,
    }

    return render(request, 'profile.html', context)

profile.html

<form method="POST" enctype="multipart/form-data">
  <div class="profile-form">
          {{ p_form }}
          {{ t_form }}
   </div>
   <button type="submit" value="submit">Update Profile</button>
</form>

Ответы [ 3 ]

1 голос
/ 13 марта 2019

Вы передаете TextSubmission форму экземпляра User, когда вы хотите передать ему экземпляр TextSubmission. Попробуйте

try:
    t_form = TextSubmissionForm(request.POST, instance=request.user.textsubmission)
except TextSubmission.DoesNotExist:
    t_form = TextSubmissionForm(request.POST)
1 голос
/ 13 марта 2019

Переопределите метод __init__() и метод save() формы как

class TextSubmissionForm(forms.ModelForm):
    <b>def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super().__init__(*args, **kwargs)

    def save(self, commit=True):
        self.instance.user = self.user
        return super().save(commit)</b>

    class Meta:
        model = TextSubmission
        fields = ['text_submission']

Тогда, по вашим представлениям,

def profile_view(request):
    if request.method == 'POST':
        <b>u_form = UserUpdateForm(request.POST)  # change is here
        t_form = TextSubmissionForm(request.POST, user=request.user)  # change is here</b>

        if u_form.is_valid() and t_form.is_valid():
            u_form.save()
            t_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')

    else:
        <b>u_form = UserUpdateForm()  # change is here
        t_form = TextSubmissionForm()  # change is here</b>

    context = {
        'u_form': u_form,
        't_form': t_form,
    }

    return render(request, 'profile.html', context)

Ссылка

  1. Передача пользователя, запрос к формам
0 голосов
/ 13 марта 2019

Для экземпляра требуется экземпляр ссылочной модели в определении формы.В вашем случае это TextSubmission, поэтому вы сначала получаете объект этой модели, а затем передаете его в TextSubmissionForm

user = User.objects.get(id = request.user)
txtSubmsn = TextSubmission.objects.get(user)
u_form = TextSubmissionForm(instance=txtSubmsn)

То же самое для UserUpdateForm

...