Django:更新更新视图中字段的值
Django: Update value for a field in Update view
我正在尝试显示模型的更新表单,其中我还想在同一视图中显示其父对象的字段(仅 1 个字段)。
我创建了一个包含所有模型字段和 1 个父字段的 forms.Form,并希望在更新视图中显示预填充的相同表单。
models.py
class Teammember(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
location = models.CharField(max_length=50)
designation = models.CharField(max_length=50)
date_of_joining = models.DateField()
current_status = models.CharField(max_length=50)
def __str__(self):
return self.first_name + " " + self.last_name
def get_absolute_url(self):
return reverse('teammember-detail', kwargs={'pk': self.pk})
forms.py
class TeammemberUpdateForm(forms.Form):
first_name = forms.CharField(max_length=50, label='First name')
last_name = forms.CharField(max_length=50, label='Last name')
email = forms.EmailField(label='Email')
location = forms.ChoiceField(choices=TP_TM_Location, label='Location')
designation = forms.ChoiceField(choices=TP_TM_Designation, label='Designation')
date_of_joining = forms.DateField(label='Date of joining',
widget=forms.TextInput(attrs={'type': 'date'}),
initial=date.today())
current_status = forms.ChoiceField(choices=TP_Status, label='Current status')
username = forms.CharField(label='Login username') #this field is referring to parent object
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['current_status'].initial = "Initial"
views.py
class TeamUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
template_name = 'project_tracker/teammember/teammember_form.html'
form_class = TeammemberUpdateForm
model = Teammember
#fields = ['first_name','last_name','email','location','designation','date_of_joining','current_status', 'username']
def get(self, request, *args, **kwargs):
#self.object = self.get_object()
print("object id: " ,self.get_object().id)
return super(TeamUpdateView, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
formclass = self.get_form_class()
print(self.get_form_class())
#print(formclass.username)
#formclass.username = 'ide'
#context['username']=self.get_object().id
#context['form']['username'] = 'ide'
print(context['form']['username'])
#context['form'] = self.form_class(instance=self.object)
return context
def get_form(self, *args, **kwargs):
"""
Returns an instance of the form to be used in this view.
# note: you can access request using: self.request
"""
form = super().get_form()
form.fields['username'] = 'ide'
return form
# def get_form_kwargs(self):
# kwargs = super(EmailView, self).get_form_kwargs()
# kwargs['users'] = self.users
# return kwargs
def form_valid(self, form):
return super().form_valid(form)
def test_func(self):
#teamMember = self.get_object()
return True
由于每个团队成员都有一个用户名,我也想在团队成员更新视图中显示相关的用户名。但目前我无法显示更新表单中预填充的用户名字段。
您可以在基于 class 的视图中使用 get_form_kwargs
。检查您是否使用了 pk or id
,因此请根据您的选择使用 pk or id
。
def get_form_kwargs(self):
kwargs = super(TeamUpdateView, self).get_form_kwargs()
x = Teammember.objects.values('user__username').select_related('user').filter(pk=self.kwargs['pk'])
kwargs['user_name'] = x[0]['user__username']
return kwargs
并在 forms.py 在您的 TeammemberUpdateForm
中。更改 init
def __init__(self, *args, **kwargs):
self.username = kwargs.pop('username')
super(TeammemberUpdateForm,self).__init__(*args, **kwargs)
self.fields['username'].initial = username
我正在尝试显示模型的更新表单,其中我还想在同一视图中显示其父对象的字段(仅 1 个字段)。
我创建了一个包含所有模型字段和 1 个父字段的 forms.Form,并希望在更新视图中显示预填充的相同表单。
models.py
class Teammember(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
location = models.CharField(max_length=50)
designation = models.CharField(max_length=50)
date_of_joining = models.DateField()
current_status = models.CharField(max_length=50)
def __str__(self):
return self.first_name + " " + self.last_name
def get_absolute_url(self):
return reverse('teammember-detail', kwargs={'pk': self.pk})
forms.py
class TeammemberUpdateForm(forms.Form):
first_name = forms.CharField(max_length=50, label='First name')
last_name = forms.CharField(max_length=50, label='Last name')
email = forms.EmailField(label='Email')
location = forms.ChoiceField(choices=TP_TM_Location, label='Location')
designation = forms.ChoiceField(choices=TP_TM_Designation, label='Designation')
date_of_joining = forms.DateField(label='Date of joining',
widget=forms.TextInput(attrs={'type': 'date'}),
initial=date.today())
current_status = forms.ChoiceField(choices=TP_Status, label='Current status')
username = forms.CharField(label='Login username') #this field is referring to parent object
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['current_status'].initial = "Initial"
views.py
class TeamUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
template_name = 'project_tracker/teammember/teammember_form.html'
form_class = TeammemberUpdateForm
model = Teammember
#fields = ['first_name','last_name','email','location','designation','date_of_joining','current_status', 'username']
def get(self, request, *args, **kwargs):
#self.object = self.get_object()
print("object id: " ,self.get_object().id)
return super(TeamUpdateView, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
formclass = self.get_form_class()
print(self.get_form_class())
#print(formclass.username)
#formclass.username = 'ide'
#context['username']=self.get_object().id
#context['form']['username'] = 'ide'
print(context['form']['username'])
#context['form'] = self.form_class(instance=self.object)
return context
def get_form(self, *args, **kwargs):
"""
Returns an instance of the form to be used in this view.
# note: you can access request using: self.request
"""
form = super().get_form()
form.fields['username'] = 'ide'
return form
# def get_form_kwargs(self):
# kwargs = super(EmailView, self).get_form_kwargs()
# kwargs['users'] = self.users
# return kwargs
def form_valid(self, form):
return super().form_valid(form)
def test_func(self):
#teamMember = self.get_object()
return True
由于每个团队成员都有一个用户名,我也想在团队成员更新视图中显示相关的用户名。但目前我无法显示更新表单中预填充的用户名字段。
您可以在基于 class 的视图中使用 get_form_kwargs
。检查您是否使用了 pk or id
,因此请根据您的选择使用 pk or id
。
def get_form_kwargs(self):
kwargs = super(TeamUpdateView, self).get_form_kwargs()
x = Teammember.objects.values('user__username').select_related('user').filter(pk=self.kwargs['pk'])
kwargs['user_name'] = x[0]['user__username']
return kwargs
并在 forms.py 在您的 TeammemberUpdateForm
中。更改 init
def __init__(self, *args, **kwargs):
self.username = kwargs.pop('username')
super(TeammemberUpdateForm,self).__init__(*args, **kwargs)
self.fields['username'].initial = username