如何为表单中的字段设置初始值?

时间:2020-02-18 00:50:33

标签: python django

在此处输入代码我遇到一些问题要解决。我有一个模板,允许用户更改一些帐户设置。我的目标是使用用户的默认值初始化表单,他可以保留或更改它们(在提交表单后)。但是,直到现在页面仍未呈现这些值。为此,我正在使用基于类的视图CreateView。

我的代码在下面列出。

这是我的CreateView。

class DetailUserInfoView(LoginRequiredMixin ,CreateView):
model = CustomUser.CustomUser
template_name = 'users/InfoUser.html'
login_url = settings.LOGOUT_REDIRECT_URL
context_object_name = 'user'
form_class = CustomUserChangeForm

def get_object(self):
    self.model = self.request.user
    return self.model

def get_initial(self):
    initial = super(DetailUserInfoView, self).get_initial()
    initial = initial.copy()
    initial[config.USERNAME] = self.request.user.username
    initial[config.FIRST_NAME] = self.request.user.first_name
    initial[config.LAST_NAME] = self.request.user.last_name
    return initial

def get_form_kwargs(self):
    kwargs = {'initial': self.get_initial()}
    return kwargs

def get_context_data(self, **kwargs): #GET OBJECT ACTS AFTER THAN GET_OBJECT --> EXAMPLE OF GET_CONTEXT_DATA, I DIDN'T NEED THIS
    context = super(DetailUserInfoView, self).get_context_data(**kwargs)
    context['username'] = self.request.user.username
    return context

这是表格。

CustomUserChangeForm(UserChangeForm)类:

class Meta(UserChangeForm.Meta):
    model = CustomUser.CustomUser
    fields = ('email', 'password', 'first_name', 'last_name', 'username', 'userType')

最后是模板的摘录。

    <div id="infoMayOverride">
        <form class="getOverridedValues" method="post">
            {% csrf_token %}
            <div id="usernameData">
                <label>{{ form.username.label_tag }}</label> <!--MODEL ON CREATEUSERVIEW IS CUSTOMUSER, AND NOW I NEED TO USE THIS FIELDS AND INHERITED FIELDS FROM USER CLASS-->
                <input type="text" id="usernameInput" value="{{ form.username }}">
            </div>
            <div id="firstNameData">
                <label>{{ form.first_name.label_tag }}</label>
                <input type="text" id="firstNameInput" value="{{ form.first_name }}">
            </div>
            <div id="lastNameData">
                <label>{{ form.last_name.label_tag }}</label>
                <input type="text" id="lastNameInput" value="{{ form.last_name }}">
            </div>
            <div id="divBtnChangeProfile">
                <input type="submit" class="btnChangeProfile" value="Atualizar Profile">
            </div>
        </form>
    </div>

如果您能帮助我,我将不胜感激。我是Django环境的新手,并且尝试了许多方法,但仍无法解决此问题。

-------------------------------更新------------------- -----------------

现在,我可以获得初始值。但是要查看它们,我需要在输入表单上写:form.username.initial,并且在提交表单后,我无法更新用户值。

任何人都知道如何解决这类问题?

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。我将提供我的解决方案,因为它可以帮助其他人。

我必须对后面提供的代码进行一些更改。

下面是视图的代码。

class DetailUserInfoView(LoginRequiredMixin, UpdateView):
model = CustomUser.CustomUser
template_name = 'users/InfoUser.html'
login_url = settings.LOGOUT_REDIRECT_URL
context_object_name = 'user'
form_class = CustomUserChangeForm

def get_object(self, queryset=None):
    return self.request.user

def get_form_kwargs(self):
    kwargs = super(DetailUserInfoView, self).get_form_kwargs()
    u = self.request.user
    kwargs['username_initial'] = u.username
    kwargs['fName_initial'] = u.first_name
    kwargs['lName_initial'] = u.last_name

    return kwargs

def get_context_data(self, **kwargs): #GET OBJECT ACTS AFTER THAN GET_OBJECT --> EXAMPLE OF GET_CONTEXT_DATA, I DIDN'T NEED THIS
    context = super(DetailUserInfoView, self).get_context_data(**kwargs)
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    context['form'] = form
    return context

我的表单(具有init函数,用于在表单上设置初始值,并由def get_form_kwargs(self)调用)。

class CustomUserChangeForm(UserChangeForm):

    def __init__(self, *args, **kwargs):
        username_initial = kwargs.pop('username_initial', None)
        fName_initial = kwargs.pop('fName_initial', None)
        lName_initial = kwargs.pop('lName_initial', None)
        super(CustomUserChangeForm, self).__init__(*args, **kwargs)
        self.fields['username'].initial = username_initial
        self.fields['first_name'].initial = fName_initial
        self.fields['last_name'].initial = lName_initial

    class Meta(UserChangeForm.Meta):
        model = CustomUser.CustomUser
        fields = ('username', 'email', 'first_name', 'last_name')

最后,在模板中,我将输入的标签替换为{{ form.username }}

我希望它可以帮助遇到相同问题的人。

相关问题