Как обновить две формы в одном представлении, где одна форма - userChangeform (djangoform), а другая - modelform (с моделью, являющейся моделью userextension)? - PullRequest
0 голосов
/ 15 марта 2020

Это модель функции пользователя.

это представление редактирования профиля, где мне нужно использовать обе формы для сохранения в базе данных из html template Это две формы, которые мне нужно использовать в одном просмотре Это шаблон html, на котором мне нужно показать контактный номер и иметь возможность редактировать его

Прошу прощения, если не могу правильно представить свой вопрос. Я хочу отображать и редактировать контактный номер на той же странице, что и другие данные, такие как имя пользователя, фамилия и имя. Я пробовал разные методы, такие как использование запроса для вызова из базы данных и сохранение формы и запроса в одной и той же функции, но он не обновлял контактный номер. Можно ли это сделать, или я должен использовать другой подход, если это можно сделать, пожалуйста, дайте мне знать? Если я пропустил некоторые детали, пожалуйста, дайте мне знать, если есть вопрос, так как я впервые задаю здесь, в стеке

views.py

@login_required()
def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            user = form.save()
            profile = user.profileModel()
            profile.contactNumber = form.cleaned_data['contactNumber']
            profile.save()
            return HttpResponseRedirect(reverse('profile'))
    else:
        form = EditProfileForm(instance = request.user)
    return render(request, 'music/edit_profile.html', {'form' : form})

models.py

class profileModel(models.Model):
    user = models.OneToOneField(User, on_delete= models.CASCADE)
    contactNumber = models.IntegerField(validators=[validate_even])
    # canPOST = models.BooleanField(default =  False)
    def __str__(self):
        return 'Profile for user {}'.format(self.user.username)

Html файл для функции редактирования профиля

 <form action="{% url 'edit_profile' %}" method="POST">
                    {% csrf_token %}

                    <div class="form-group">
                        <label for="exampleUserName1" >User Name</label>
<!--                      taking username as an input-->
                        <input type="text" name="username" value="{{ request.user.username }}" maxlength="150" required id="id_username" class="form-control" >
                        <small id="usernameHelpInline" class="text-muted">
                            Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.
                        </small>
                    </div >

                    <div class="form-group">
                        <!--                      taking first name as an input-->
                        <label for="exampleFirstName1" >First Name</label>
                        <input type="text" name="first_name" value="{{ request.user.first_name }}" maxlength="30" required id="id_first_name" class="form-control" >
                    </div >

                    <div class="form-group">
                        <!--                      taking last name as an input-->
                        <label for="exampleLastName1" >Last Name</label>
                        <input type="text" name="last_name" value="{{ request.user.last_name }}" maxlength="150" required id="id_last_name" class="form-control" >
                    </div >
                        <input type="hidden" name="password" value="{{ request.user.password }}" id="id_password">
                   <!--                      submit button to edit profile -->
                    <button type="submit" class="btn btn-primary" value="Edit Profile">Edit Profile</button>
                    </form>

Forms.py

class EditProfileForm(UserChangeForm):
    password = forms.CharField(label='', widget = forms.TextInput(attrs = {'type' : 'hidden'}))
    contactNumber = forms.CharField()
    class Meta:
        model = User
        fields = ['username',
                  'first_name',
                  'last_name',
                  'password',
                  ]

#User Extra Information ................
class profileInformForm(forms.ModelForm):
    class Meta:
        model = profileModel
        fields = ['contactNumber']

1 Ответ

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

Попробуйте, вам нужна только одна форма, а не две. И контактный номер из модели профиля должен быть CharField, а не IntegerField.

# models.py

class ProfileModel(models.Model):
    user = models.OneToOneField(User, on_delete= models.CASCADE)
    contact_ number = models.IntegerField(validators=[validate_even])

    def __str__(self):
        return 'Profile for user {}'.format(self.user.username)


# forms.py
class EditProfileForm(UserChangeForm):
    password = forms.CharField(label='', widget = forms.TextInput(attrs = {'type' : 'hidden'}))
    contact_number = forms.CharField()

    class Meta:
        model = User
        fields = ['username',
                  'first_name',
                  'last_name',
                  'password',
                  ]


# views.py
@login_required()
def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            user = form.save()
            # profile should be one2one with profile model and then you can easily do this
            # profile = user.profile
            # with ForeignKey
            profile = user.profilemodel_set.first()  # or if has many, get the one you need to update.
            profile.contact_number = form.cleaned_data['contact_number']
            profile.save()
            return HttpResponseRedirect(reverse('profile'))
    else:
        form = EditProfileForm(instance = request.user)
    return render(request, 'music/edit_profile.html', {'form' : form})
...