Джанго не может обновить модели и не показывает ошибки - PullRequest
0 голосов
/ 05 марта 2019

Я использую версию Django 2.1. Я создал модель AuthUserProfile и хочу обновить данные в моделях User и AuthUserProfile. Для этого я создал ModelForm, который переопределил его метод __init__().

В чем проблема, с которой я сталкиваюсь: я не могу обновить () существующие данные в User и AuthUserProfile модели, и я не получаю ошибки

Модель AuthUserProfile

class AuthUserProfile(models.Model):
    user_profile_id = models.AutoField(primary_key=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    dob =  models.DateField(blank=True, null=True)
    is_deleted = models.PositiveSmallIntegerField(default=0)
    created_at = models.DateTimeField(auto_now=datetime.now(), null=True)
    updated_at = models.DateTimeField(auto_now=datetime.now(), null=True)

    class Meta():
        db_table = 'auth_user_profile'
        verbose_name = 'User Profile'
        verbose_name_plural = 'User Profiles'

ModelForm: forms.py

class CreateUserProfileForm(ModelForm):
    user = forms.CharField(
        max_length=25, widget=forms.HiddenInput(attrs={'class': 'form-control', 'id': 'user', }), required=False,
    )

    first_name = forms.CharField(
        max_length=25, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'first_name', }), required=True,
    )

    last_name = forms.CharField(
        max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'last_name', }), required=False,
    )

    dob = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'dob', 'type': 'date', }), required=False,
                          )

    username = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'username', }), required=True,
                               )

    email = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'email', 'type': 'email'}), required=True,
                            )

    password = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'password', 'type': 'password', }), required=True,
                               )

    cfm_password = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control', 'id': 'cfm_password', 'type': 'password', }), required=True,
                                   )

    class Meta:
        model = AuthUserProfile
        fields = ('dob',)

    def __init__(self, *args, **kwargs):
        options = kwargs.get('options') or None
        if options is not None:
            options = kwargs.pop('options')

        super(CreateUserProfileForm, self).__init__(*args, **kwargs)

        if options is not None and options.get('exclude_field'):
            field_tuples = options.get('exclude_field')
            for i in field_tuples:
                if self.fields.get(i):
                    self.fields.pop(i)

        if options is not None and options.get('field_attr') is not None:
            for i, j in options.get('field_attr').items():
                if j.get('attrs') is not None:
                    attrs = j.get('attrs')
                    if attrs.get('disabled'):
                        if self.fields.get(i):
                            self.fields[i].disabled = attrs.get('disabled')

    def clean_username(self):
        # print('\n\n\nvalidate username\n\n\n')
        username = self.cleaned_data['username']
        # print(username)
        user_id = self.cleaned_data.get('id')
        qs = User.objects.filter(username=username).exclude(id=user_id)
        if qs.count() > 0:
            raise forms.ValidationError(_("Username has already being used."))
        return username

    def clean(self):
        cleaned_data = self.cleaned_data
        password = cleaned_data.get("password")
        cfm_password = cleaned_data.get("cfm_password")
        # print(password)
        # print(cfm_password)
        if password != cfm_password:
            raise forms.ValidationError(_(
                "password and confirm password does not match"
            ))

Views.py:

# update user
def post(self, request, *args, **kwargs):
    # add 'username' to exclude fields
    self.opts['exclude_field'] = self.opts['exclude_field']+('username',)
    # print(self.opts)

    user_profile_instance = User.objects.get(pk=request.POST['user'])
    form = CreateUserProfileForm(
        request.POST, options=self.opts, instance=user_profile_instance)

    if form.is_valid():
        createUser = CreateUser()
        res = createUser.process_form(request, **{
            'form': form
        })

        if res.get('success') == True:
            messages.add_message(request, messages.SUCCESS, res['msg'])
        else:
            messages.add_message(request, messages.ERROR, res['msg'])
        return HttpResponseRedirect(reverse('users:edit-user', kwargs={'id': form.cleaned_data.get('user')}))

    # print(form.errors)
    # return HttpResponse('form failed')
    messages.add_message(request, messages.ERROR, "Something went wrong.")

    return render(
        request,
        'users/create_form.html',
        {
            'mode': 'EDIT',
            'form': form,
        }
    )

Эта функция ниже process_form() используется для сохранения и обновления данных пользователя и профиля пользователя

def process_form(self, request, *args, **kwargs):
        is_update_opt = False
        info = {
            'success': False,
            'msg': 'Something went wrong.',
            'user_obj': {},
        }

        user_id = kwargs['form'].cleaned_data.get('user') or None

        q = {
            'first_name': kwargs['form'].cleaned_data.get('first_name'),
            'last_name': kwargs['form'].cleaned_data.get('last_name'),
            'username': kwargs['form'].cleaned_data.get('username'),
            'password': make_password(kwargs['form'].cleaned_data.get('password')),
            'email': kwargs['form'].cleaned_data.get('email'),
            'is_superuser': 0,
            'is_staff': 0,
            'is_active': 1,
            'date_joined': datetime.now(),
        }

        if user_id is not None:
            pop_list = [
                'username', 'password', 'is_superuser', 'is_staff', 'date_joined'
            ]
            for i in pop_list:
                q.pop(i)

        user_res = User(**q)
        if user_id is not None:
            is_update_opt = True
            user_res = User.objects.filter(pk=user_id).update(**q) #this query is not updating
            if user_res > 0:
                user_res = User.objects.filter(pk=user_id).first()
        else:
            user_res.save()

        if user_res is not None and user_res.id:
            info['user_obj'] = user_res
            info['success'] = True
            if is_update_opt == True:
                info['msg'] = 'Update successfully'
            else:
                info['msg'] = 'Save successfully'
            # user profile model
            user_profile = kwargs['form'].save(commit=False)
            user_profile.user_id = user_res.id
            user_profile.save()

        # return HttpResponse(info)
        return info

Ниже я загрузил изображение

output gif image

Пожалуйста, предложите мне

1 Ответ

0 голосов
/ 05 марта 2019

вам нужно вызвать метод save в форме для сохранения.

if form.is_valid():
    createUser = CreateUser()
    res = createUser.process_form(request, **{
        'form': form
    })

    if res.get('success') == True:
        messages.add_message(request, messages.SUCCESS, res['msg'])
    else:
        messages.add_message(request, messages.ERROR, res['msg'])
    return HttpResponseRedirect(reverse('users:edit-user', kwargs={'id': form.cleaned_data.get('user')}))

это ваш код, и я хочу увидеть любой from.save ().просто вызовите save после метода is_valid в форме.

...