django - Django:在更新视图中更新字段的值
问题描述
我正在尝试显示模型的更新表单,其中我还想在同一视图中显示其父对象的字段(仅 1 个字段)。
我创建了一个包含所有模型字段和 1 个父字段的 forms.Form,并希望在更新视图中显示预先填写的相同表单。
模型.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})
表格.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"
视图.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
由于每个团队成员都有一个用户名,我还想在团队成员更新视图中显示相关的用户名。但目前我无法显示更新表单中预先填充的用户名字段。
解决方案
您可以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
。改变初始化
def __init__(self, *args, **kwargs):
self.username = kwargs.pop('username')
super(TeammemberUpdateForm,self).__init__(*args, **kwargs)
self.fields['username'].initial = username
推荐阅读
- database-connection - Are there changes in Workbench connecting to Google Cloud MySql?
- sql - MariaDB having syntax in a new MariaDB install
- python - Importing constants (function names) from external file
- matlab - What is the significance of data set sampling during Bagging method for dynamic classifier selection method?
- ruby-on-rails - 如何使用字符串动态获取对象的值
- python - 避免for循环?
- spring-boot - 在父抽象类中使用 HATEOAS RepresentationModel
- batch-file - Windows Batch:CMD 完成后调用
- python - 使用 Python 将文件移入和移出 Amazon S3 存储桶键
- sql - ORA-22992 / ORA-06502+ORA-06512 错误