forms.py中的for循环无法在它之后立即加载数据';s sent | Python Django
在forms.py中,我有一段加载数据的短代码,但只有在编辑了其中的forms.py中的for循环无法在它之后立即加载数据';s sent | Python Django,python,django,Python,Django,在forms.py中,我有一段加载数据的短代码,但只有在编辑了其中的print(“hello”)之后 守则如下: models.py: class CreateAssignment(models.Model): user = models.ForeignKey(User, editable=False, blank=True, null=True) progress = models.CharField(max_length=254, editable=False, blank=
print(“hello”)
之后
守则如下:
models.py
:
class CreateAssignment(models.Model):
user = models.ForeignKey(User, editable=False, blank=True, null=True)
progress = models.CharField(max_length=254, editable=False, blank=True, null=True)
class SetAssignment(models.Model):
mechanic = models.ForeignKey(User, editable=False, blank=True, null=True)
assignment = models.IntegerField(blank=True, null=True)
class SetAssignmentForm(forms.ModelForm):
ASSIGNMENT_CHOICES = ()
for item in CreateAssignment.objects.all():
if item.progress == 'Scheduling':
user = User.objects.get(id=item.user_id).username
ASSIGNMENT_CHOICES += (
(item.id, user + ' - ' + str(item.id)),
)
assignment = forms.ChoiceField(choices=ASSIGNMENT_CHOICES, help_text='This is the assignment that you want to apply to this mechanic.')
class Meta:
model = SetAssignment
fields = ('assignment', )
@login_required
def set_assignment(request):
form = SetAssignmentForm()
id = request.GET.get('id')
user_results = User.objects.filter(pk=id).values()
return render(request, 'pages/set_assignment.html', {'form': form, 'user_results': user_results})
该技工是一个权限,当您尝试为该技工设置任务时,该技工的ID将显示在网站的url中
forms.py
:
class CreateAssignment(models.Model):
user = models.ForeignKey(User, editable=False, blank=True, null=True)
progress = models.CharField(max_length=254, editable=False, blank=True, null=True)
class SetAssignment(models.Model):
mechanic = models.ForeignKey(User, editable=False, blank=True, null=True)
assignment = models.IntegerField(blank=True, null=True)
class SetAssignmentForm(forms.ModelForm):
ASSIGNMENT_CHOICES = ()
for item in CreateAssignment.objects.all():
if item.progress == 'Scheduling':
user = User.objects.get(id=item.user_id).username
ASSIGNMENT_CHOICES += (
(item.id, user + ' - ' + str(item.id)),
)
assignment = forms.ChoiceField(choices=ASSIGNMENT_CHOICES, help_text='This is the assignment that you want to apply to this mechanic.')
class Meta:
model = SetAssignment
fields = ('assignment', )
@login_required
def set_assignment(request):
form = SetAssignmentForm()
id = request.GET.get('id')
user_results = User.objects.filter(pk=id).values()
return render(request, 'pages/set_assignment.html', {'form': form, 'user_results': user_results})
这种情况下的user\u id
是在CreateAssignment
模型中设置的user
现在的问题是:
中的SetAssignmentForm
循环可以工作,但是在我将for
放入循环后,或者当我从循环中移除print
时,它会加载数据。这当然不会真正影响代码print
views.py
:
class CreateAssignment(models.Model):
user = models.ForeignKey(User, editable=False, blank=True, null=True)
progress = models.CharField(max_length=254, editable=False, blank=True, null=True)
class SetAssignment(models.Model):
mechanic = models.ForeignKey(User, editable=False, blank=True, null=True)
assignment = models.IntegerField(blank=True, null=True)
class SetAssignmentForm(forms.ModelForm):
ASSIGNMENT_CHOICES = ()
for item in CreateAssignment.objects.all():
if item.progress == 'Scheduling':
user = User.objects.get(id=item.user_id).username
ASSIGNMENT_CHOICES += (
(item.id, user + ' - ' + str(item.id)),
)
assignment = forms.ChoiceField(choices=ASSIGNMENT_CHOICES, help_text='This is the assignment that you want to apply to this mechanic.')
class Meta:
model = SetAssignment
fields = ('assignment', )
@login_required
def set_assignment(request):
form = SetAssignmentForm()
id = request.GET.get('id')
user_results = User.objects.filter(pk=id).values()
return render(request, 'pages/set_assignment.html', {'form': form, 'user_results': user_results})
Gif,以便您可以直观地看到发生了什么:
您不能在类级别编写这样的代码。在该级别上的任何操作只在定义时执行一次,即第一次导入类时 如果需要使值动态化,则应将逻辑放入
\uuuuu init\uuuu
方法中:
class SetAssignmentForm(forms.ModelForm):
assignment = forms.ChoiceField(choices=[], help_text='This is the assignment that you want to apply to this mechanic.')
def __init__(self, *args, **kwargs):
super(SetAssignmentForm, self).__init__(*args, **kwargs)
items = CreateAssignment.objects.filter(progress='Scheduling').select_related('user')
choices = [(item.id, '{} - {}'.format(item.id, item.user.username)) for item in items]
self.fields['assignment'].choices = choices
(注意,您的查询逻辑非常低效;我的代码只命中数据库一次。)
但是,在这里您甚至不需要这样做,因为Django已经有一个表单字段modelcooicefield,它从数据库中获取其值。您可以使用其自定义子类来显示表示:
class AssignmentField(forms.ModelChoiceField):
def label_from_instance(self, item):
return (item.id, '{} - {}'.format(item.id, item.user.username))
class SetAssignmentForm(forms.ModelForm):
assignment = forms.AssignmentField(queryset=CreateAssignment.objects.filter(progress='Scheduling').select_related('user'))
您不能在类级别编写这样的代码。在该级别上的任何操作只在定义时执行一次,即第一次导入类时 如果需要使值动态化,则应将逻辑放入
\uuuuu init\uuuu
方法中:
class SetAssignmentForm(forms.ModelForm):
assignment = forms.ChoiceField(choices=[], help_text='This is the assignment that you want to apply to this mechanic.')
def __init__(self, *args, **kwargs):
super(SetAssignmentForm, self).__init__(*args, **kwargs)
items = CreateAssignment.objects.filter(progress='Scheduling').select_related('user')
choices = [(item.id, '{} - {}'.format(item.id, item.user.username)) for item in items]
self.fields['assignment'].choices = choices
(注意,您的查询逻辑非常低效;我的代码只命中数据库一次。)
但是,在这里您甚至不需要这样做,因为Django已经有一个表单字段modelcooicefield,它从数据库中获取其值。您可以使用其自定义子类来显示表示:
class AssignmentField(forms.ModelChoiceField):
def label_from_instance(self, item):
return (item.id, '{} - {}'.format(item.id, item.user.username))
class SetAssignmentForm(forms.ModelForm):
assignment = forms.AssignmentField(queryset=CreateAssignment.objects.filter(progress='Scheduling').select_related('user'))
您几乎肯定希望使用
modelcoocefield
,而不是ChoiceField
。您的循环将仅在定义类时运行,而不是在每次表单创建时运行,因此在Django启动时,您的选择将仅是数据库中的那些CreateAssignment
实例。这里您将返回一个QuerySet:User.objects.filter(pk=id)
。您希望有多少用户具有相同的id?您几乎肯定希望使用modelcoocefield
,而不是ChoiceField
。您的循环将仅在定义类时运行,而不是在每次表单创建时运行,因此在Django启动时,您的选择将仅是数据库中的那些CreateAssignment
实例。这里您将返回一个QuerySet:User.objects.filter(pk=id)
。您希望有多少用户具有相同的id?谢谢,您的解释为我解决了这个问题,非常有趣,在\uuuuu init\uuuuuuuuuuuu
方面还没有太多效果,我现在肯定想进一步研究一下。而且我还不知道你可以自己耕种田地。感谢这些有趣的解决方案。谢谢,你的解释为我解决了这个问题,真的很有趣,在\uuuu init\uuuu
方面还没有太大的效果,我现在肯定想进一步研究一下。而且我还不知道你可以自己耕种田地。感谢这些有趣的解决方案。