forms.py中的for循环无法在它之后立即加载数据';s sent | Python Django

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=

在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=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
    时,它会加载数据。这当然不会真正影响代码
有什么是我忽略的吗?我已经用PythonDjango编程8周了,所以如果这是一个基本的程序失败,请让我参考一个页面,因为我还没有找到关于这个问题的任何信息

谢谢你的帮助

对于那些想知道的人:

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
方面还没有太大的效果,我现在肯定想进一步研究一下。而且我还不知道你可以自己耕种田地。感谢这些有趣的解决方案。