Python 如何使用Django表单在前端显示模型字段值的动态可靠列表?
我有一个Python 如何使用Django表单在前端显示模型字段值的动态可靠列表?,python,django,drop-down-menu,dynamic-list,Python,Django,Drop Down Menu,Dynamic List,我有一个Detail模型,它有一个User模型的ForeignKey()。我想在模板的前端显示与单个用户关联的主题(这是详细信息模型的字段)列表。它应该是一个下拉菜单,用户应该能够从列表中选择主题并提交表单 我应该如何完成它 下面是我的模型.py class Detail(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) subject = models.CharField(max_le
Detail
模型,它有一个User
模型的ForeignKey()
。我想在模板的前端显示与单个用户关联的主题
(这是详细信息
模型的字段)列表。它应该是一个下拉菜单,用户应该能够从列表中选择主题并提交表单
我应该如何完成它
下面是我的模型.py
class Detail(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
subject = models.CharField(max_length=50)
skype_session_attendance = models.FloatField()
internal_course_marks = models.FloatField()
programming_lab_activity = models.FloatField()
mid_term_marks = models.FloatField()
final_term_marks = models.FloatField()
def __str__(self):
return f'{self.subject, (self.user.username)} Details'
class Detail(models.Model):
#create your choice tuple
SUBJECT_CHOICES = [
#(actual value on database, human readable text)
('math','Math'),
('algebra1', 'Algebra I'),
('calculus3','Calculus III'),
]
user = models.ForeignKey(User, on_delete=models.CASCADE)
#here add the choices
subject = models.CharField(max_length=50, choices=SUBJECT_CHOICES)
skype_session_attendance = models.FloatField()
internal_course_marks = models.FloatField()
programming_lab_activity = models.FloatField()
mid_term_marks = models.FloatField()
final_term_marks = models.FloatField()
def __str__(self):
return f'{self.subject, (self.user.username)} Details'
下面是my views.py:
def performanceCalculator(request):
if request.method == 'POST':
performance_form = PerformanceCalculatorForm(request.POST, user=request.user)
if performance_form.is_valid():
sub = performance_form.cleaned_data['subject']
detail = Detail.objects.all().filter(user=request.user, subject=sub).first()
result = fuzz_algo(detail.skype_session_attendance,
detail.internal_course_marks, detail.programming_lab_activity,
detail.mid_term_marks, detail.final_term_marks)
messages.success(request, result)
return redirect('performance_calculator')
else:
performance_form = PerformanceCalculatorForm(user=request.user)
context = {
'performance_form': performance_form,
}
return render(request, 'users/performance_calculator.html', context)
class PerformanceCalculatorForm(forms.Form):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super(PerformanceCalculatorForm, self).__init__(*args, **kwargs)
self.fields['subject'].queryset = Detail.objects.filter(user=user)
subject = forms.ModelChoiceField(queryset=None)
class Meta:
fields = ['subject']
下面是forms.py:
class PerformanceCalculatorForm(forms.Form):
subject = # what should I put here in order to make a dropdown list?
class Meta:
fields = ['subject']
以下是views.py中PerformanceCalculatorForm的更新代码:
def performanceCalculator(request):
if request.method == 'POST':
performance_form = PerformanceCalculatorForm(request.POST, user=request.user)
if performance_form.is_valid():
sub = performance_form.cleaned_data['subject']
detail = Detail.objects.all().filter(user=request.user, subject=sub).first()
result = fuzz_algo(detail.skype_session_attendance,
detail.internal_course_marks, detail.programming_lab_activity,
detail.mid_term_marks, detail.final_term_marks)
messages.success(request, result)
return redirect('performance_calculator')
else:
performance_form = PerformanceCalculatorForm(user=request.user)
context = {
'performance_form': performance_form,
}
return render(request, 'users/performance_calculator.html', context)
class PerformanceCalculatorForm(forms.Form):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super(PerformanceCalculatorForm, self).__init__(*args, **kwargs)
self.fields['subject'].queryset = Detail.objects.filter(user=user)
subject = forms.ModelChoiceField(queryset=None)
class Meta:
fields = ['subject']
你不需要把它放在这里
class PerformanceCalculatorForm(forms.Form):
subject = # what should I put here in order to make a dropdown list?
class Meta:
fields = ['subject']
上面有一些片段
相反,在您的模型上执行此操作。py
class Detail(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
subject = models.CharField(max_length=50)
skype_session_attendance = models.FloatField()
internal_course_marks = models.FloatField()
programming_lab_activity = models.FloatField()
mid_term_marks = models.FloatField()
final_term_marks = models.FloatField()
def __str__(self):
return f'{self.subject, (self.user.username)} Details'
class Detail(models.Model):
#create your choice tuple
SUBJECT_CHOICES = [
#(actual value on database, human readable text)
('math','Math'),
('algebra1', 'Algebra I'),
('calculus3','Calculus III'),
]
user = models.ForeignKey(User, on_delete=models.CASCADE)
#here add the choices
subject = models.CharField(max_length=50, choices=SUBJECT_CHOICES)
skype_session_attendance = models.FloatField()
internal_course_marks = models.FloatField()
programming_lab_activity = models.FloatField()
mid_term_marks = models.FloatField()
final_term_marks = models.FloatField()
def __str__(self):
return f'{self.subject, (self.user.username)} Details'
通过将元组传递给选项a值,它将在渲染时替换为选择框
与将选项以友好方式添加到模型字段相关的更新: 更好、更实用的方法是使用一个函数返回每个主题并将其附加到选项列表中 在您的models.py中,像以前一样保留它
class Detail(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
subject = models.CharField(max_length=50)
skype_session_attendance = models.FloatField()
internal_course_marks = models.FloatField()
programming_lab_activity = models.FloatField()
mid_term_marks = models.FloatField()
final_term_marks = models.FloatField()
def __str__(self):
return f'{self.subject, (self.user.username)} Details'
对于您评论的问题,您只需将\uu str\uu
返回到您喜欢的任何位置,但使用特殊字符将其分开,然后这将在POST请求中看到,并使用split()
将主题
从queryset对象中取出
在您的模型的\uuuu str\uuuu
处:
return f'{self.user.username}-{self.subject}'
现在,在your views.py中,对要匹配的零件使用split()
def performanceCalculator(request):
if request.method == 'POST':
performance_form = PerformanceCalculatorForm(request.POST, user=request.user)
if performance_form.is_valid():
sub = performance_form.cleaned_data['subject']
sub = str(sub).split('-')[1] #user-subject will get the subject part
detail = Detail.objects.all().filter(user=request.user, subject=sub).first()
result = fuzz_algo(detail.skype_session_attendance,
detail.internal_course_marks, detail.programming_lab_activity,
detail.mid_term_marks, detail.final_term_marks)
messages.success(request, result)
return redirect('performance_calculator')
else:
performance_form = PerformanceCalculatorForm(user=request.user)
context = {
'performance_form': performance_form,
}
return render(request, 'users/performance_calculator.html', context)
10个视图但没有帮助?:(@Paaksing你能帮我吗?嗨,回到这里,你想要一个下拉选择菜单,对吗?我想文档已经指定了在我阅读更多你的代码时看一看。嗨@Paaksing实际上,我不想手动传递主题名。我想传递当前登录用户的主题名。顺便说一下,我得到了解决方案,但是现在我有另一个问题。我在
PerformanceCalculatorForm()中使用了\uuuu init\uuuu()
构造函数
获取已成功登录用户的主题。但我面临的新问题是,为了使其正常工作,我必须更改Detail
模型的\uuu str\uuuu
方法以仅返回主题名称,因此,如果多个用户具有相同的主题,那么在管理面板的Details表中,我会看到相同的主题名称ubject多次,并且无法区分哪个主题属于哪个用户,除非我没有打开它们并看到用户名。对此有什么解决方案吗?我必须将返回f'{self.subject,(self.user.username)}详细信息'
更改为返回f'{self.subject}“
以使其仅返回主题名称,因为如果我将其与用户名一起返回,则performanceCalculator()
视图中的detail
变量将获得None
,因为返回的值(带有用户名的主题名称)通过\uuuu str\uuuuu
方法将不会与当前登录用户的任何主题名称匹配。但是解决了这个问题,现在我的主题名称在管理面板中没有用户名,并且无法区分哪个主题属于哪个用户。@KhubaibKhawar这不实用,但您可以使用技巧,只要返回f'{self.user.username}-{self.subject}'
然后当您想要访问它时,只需在str变量之后调用split('-')[1]
。它将在“-”之后得到第二个split字符。你能通过编辑代码给出例子吗?让我分享一下\uuuu init\uuuuu
构造函数的代码,在这里我可以得到主题:self.fields['subject'].queryset=Detail.objects.filter(user=user)
你能告诉我使用split('-')[1]
?