Метод save () в forms.py не может сохранить внешний ключ в Django - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь сохранить текущего пользователя в forms.py с помощью метода save (). Можете ли вы помочь мне решить эту проблему

вот мои модели.py models.py

class Warden(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    firstName = models.CharField(max_length=30,null=True)
    lastName = models.CharField(max_length=30,null=True)
    email = models.EmailField(null=True)
    phone_number = models.CharField(max_length=12 ,null=True)
    hostel_name=models.CharField(max_length=20,null=True)
    profile_image = models.ImageField(default="logo-2.png",upload_to='users/', null=True, blank=True )

    def __str__(self):
        return self.email


class HostelStaff(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    firstName = models.CharField(max_length=30,null=True)
    lastName = models.CharField(max_length=30,null=True)
    email = models.EmailField(null=True)
    phone_number = models.CharField(max_length=12 ,null=True)
    hostel_name=models.CharField(max_length=100)
    #this is forignkey in which i want to save logged user
    warden = models.ForeignKey(Warden, on_delete=models.CASCADE)
    profile_image = models.ImageField(default="logo-2.png",upload_to='users/', null=True, blank=True )

    def __str__(self):
        return self.firstName + ' ' + self.lastName

это мой файл forms.py, куда я перехожу, сохраняю метод forms.py

class StaffSignUpForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = User
        fields = ('username',)

    def save(self):
        user = super().save(commit=False)
        user.is_hostelstaff = True
        user.save()
        return user

    def __init__(self, *args, **kwargs):
        super(StaffSignUpForm, self).__init__(*args, **kwargs)
        self.fields['username'].widget.attrs['placeholder'] = ' username'
        self.fields['password1'].widget.attrs['placeholder'] = ' password'
        self.fields['password2'].widget.attrs['placeholder'] = ' confirm password'
        self.helper = FormHelper()
        self.helper.form_show_labels = False
        for fieldname in ['username','password1', 'password2']:
            self.fields[fieldname].help_text = None


class StaffSignUpTwo(forms.ModelForm):
    class Meta:
        model = HostelStaff
        fields = ('firstName', 'lastName','email', 'phone_number', 'hostel_name',)

    def __init__(self, user, *args, **kwargs):
        super(StaffSignUpTwo, self).__init__(*args, **kwargs)
        self.fields['firstName'].widget.attrs['placeholder'] = ' first name'
        self.fields['lastName'].widget.attrs['placeholder'] = ' last name'
        self.fields['hostel_name'].widget.attrs['placeholder'] = ' hostel name'
        self.fields['email'].widget.attrs['placeholder'] = ' email'
        self.fields['phone_number'].widget.attrs['placeholder'] = ' phone '
        self.helper = FormHelper()
        self.helper.form_show_labels = False

    @transaction.atomic
    def save(self, user):
        self.fields['user'] = user
        firstName = self.cleaned_data['firstName']
        lastName = self.cleaned_data['lastName']
        email = self.cleaned_data['email']
        phone_number = self.cleaned_data['phone_number']
        hostel_name = self.cleaned_data['hostel_name']
        hostelstaff = HostelStaff.objects.create(user=user,  email=email,firstName=firstName,lastName=lastName,
                                       phone_number=phone_number,hostel_name=hostel_name)
        #here is save method 
        def save(self,pk,commit=True):
            obj = super().save(commit=False)
            #i think error in this line
            obj.warden=Warden.objects.get(user=self.user)
            obj.save()
            return obj

views.py

def StaffSignUpView(request):
    if request.method == 'POST':
        main_form = StaffSignUpForm(request.POST)
        secondary_form = StaffSignUpTwo(request.user,request.POST)
        if main_form.is_valid() and secondary_form.is_valid():
            user = main_form.save()
            secondary_form.save(request.user)
            return redirect('warden_view:warden-home')
    else:
        main_form = StaffSignUpForm()
        secondary_form = StaffSignUpTwo(request.user)
    return render(request, 'warden_view/create_staff.html', {
        'main_form': main_form,
        'secondary_form': secondary_form
    })

ошибка scrrenshot

метод save () в forms.py не может сохранить внешний ключ в Django метод save () в forms.py не может сохранить внешний ключ в Django save () в методе forms.py не может сохранить внешний ключ в Метод Djangosave () в forms.py не может сохранить внешний ключ в методе Djangosave () в forms.py, не может сохранить внешний ключ в методе Djangosave () в forms.py, не может сохранить внешний ключ в методе Djangosave () в forms.py невозможно сохранить внешний ключ в методе Djangosave () в forms.py не удается сохранить внешний ключ в методе Djangosave () в forms.py не удается сохранить внешний ключ в Django

1 Ответ

0 голосов
/ 22 марта 2020

Вы не устанавливаете значение для объекта, заключенного в форму, с помощью:

    @transaction.atomic
    def save(self, user):
        <s>self.fields['user'] = user</s>
        # &hellip;

Но с:

    @transaction.atomic
    def save(self, user):
        <b>self.instance.user = user</b>
        # &hellip;

, как для warden, похоже, что вы обернул это в функцию в метод .save(). Это тоже не очень хорошая идея.

Кроме того, вы создаете HostelStaff объект в save() методе формы, который, конечно, не имеет поля warden.

    @transaction.atomic
    def save(self, user):
        self.instance.user = user
        <b>self.instance.warden, __ = Warden.objects.get_or_create(user=user)</b>
        return super()<b>.save()</b>

Однако я настоятельно рекомендую не переопределять сигнатуру метода save(), поскольку представления на основе классов и т. Д. c. часто вызывают эти функции тоже.

...