gpt4 book ai didi

python - Django session 中的当前字段值

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:36 25 4
gpt4 key购买 nike

我正在构建一个 Django 网络应用程序以允许客户注册类(class)。在“培训”页面上列出了所有类(class)。用户单击类(class)以获取更多详细信息并申请该类(class)。类(class)模型如下所示:

class Course(models.Model):
course_text = models.CharField(max_length=200)
slug = models.SlugField()
leader_text = models.TextField()
location = models.CharField(max_length=50)
start_date = models.DateField('start date')
duration_days = models.CharField (max_length=1)
cost = models.DecimalField(max_digits=7, decimal_places=2)
available = models.CharField(max_length=2)
class Meta:
ordering = ['start_date']

我有一个应用程序模型“申请人”,如下所示:

class Applicant(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.EmailField(max_length=75)
contact_date = models.DateTimeField(auto_now=True)
courses = models.ManyToManyField(Course)

当用户单击一门类(class)时,该类(class)的详细信息将呈现在 View 中,并且还会为申请流程呈现一个 ModelForm。 View 如下所示:

def view_course(request, slug):
print Course.objects.all() #Just for testing

if request.method == "POST":
form = ApplicantForm(request.POST)
if form.is_valid():
model_instance = form.save(commit=False)
model_instance.save()


return HttpResponseRedirect('/thanks/')
else:
form = ApplicantForm()

return render(request, 'training/view_course.html', {'course': get_object_or_404(Course, slug=slug), 'form': form})

以上所有工作,我可以在我的 django 管理中查看用户申请。我想做的是收集他们申请的类(class)的具体信息,并将其与每个用户联系起来。我希望“类(class)”模型上的 ManyToMany 关系会有所帮助,但如果我将它包含在呈现的表单中,它只会提供选择任何类(class)的选项。

我正在使用诸如 Course.objects.all() 之类的查询集,但我需要根据 View 中“Course”的当前值对其进行过滤。是否有当前命令或类似命令来获取当前 session 中保存的数据?

我使用 Django 1.7 和 MySQL 作为数据库。

澄清

我想在用户填写的表单上显示最小值以简化申请流程。因此只需要 first_name、last_name 和 email。我希望将此信息链接到用户当前正在查看的类(class),以便这些值自动完成并且不会被用户看到。

至于数据库中的许多申请人实例,这不是多对多关系的工作方式吗?在我的管理页面中,我希望能够点击一个用户并查看他们注册的类(class),还能够点击一门类(class)以查看有多少用户申请了。我的管理页面还远远不够,但我希望能够在担心之前保存当前信息。这是管理员的样子:

from django.contrib import admin
from training.models import Course, Applicant

class CourseAdmin (admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['course_text', 'location', 'start_date', 'duration_days', 'cost', 'available']}),
('Course details', {'fields': ['leader_text'], 'classes': ['collapse']}),
]

list_display = ['course_text', 'location','start_date', 'was_published_recently']
list_filter = ['start_date', 'location']
search_fields = ['course_text']



admin.site.register(Course, CourseAdmin)

class ApplicantAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['first_name', 'last_name', 'email',]}),
]
list_display = ['first_name', 'last_name','email',]
list_filter = ['first_name', 'last_name']
search_fields = ['courses']

admin.site.register(Applicant, ApplicantAdmin)

某种解决方案

首先要感谢 spookylukey。完全正确的是,我有两件事正在发生,事实上,让同一个用户创建多个申请人对象可能会产生问题。我试图摆脱 auth/auth 的想法,因为我认为它会导致很多人流失。我现在明白为什么它很重要了。

撇开 spookylukey 关于使用 Model.ManyToManyField.add() 方法的建议行之有效。 view.py 的代码现在是:

def view_course(request, slug):

courseId = Course.objects.get(slug=slug)

if request.method == "POST":
form = ApplicantForm(request.POST)
if form.is_valid():

applicant = form.save(commit=False)
applicant.save()
form.save_m2m()
#The add method working it's magic
applicant.courses.add(courseId)

return HttpResponseRedirect('/thanks/')
else:
form = ApplicantForm()
#print request.session['course' : get_object_or_404(Course, slug=slug)]
return render(request, 'training/view_course.html', {'course': get_object_or_404(Course, slug=slug), 'form': form})

在管理界面中查看关系的额外问题已通过使用 InlineModelAdmin 对象解决。所以 admin.py 看起来像这样:

class SignupsInline(admin.TabularInline):
model = Applicant.courses.through



class CourseAdmin (admin.ModelAdmin):
#other styling goes here...

inlines = [
SignupsInline,
]

admin.site.register(Course, CourseAdmin)

class ApplicantAdmin(admin.ModelAdmin):
#other styling goes here...

inlines = [
SignupsInline,
]
admin.site.register(Applicant, ApplicantAdmin)

为了获得有关关联申请人对象(在类(class)管理部分)或类(class)对象(在申请人管理部分)的更多信息,我将以下功能添加到申请人模型(以及相应的类(class)模型):

    def __unicode__(self):
return u'%s %s %s' % (self.first_name, self.last_name, self.email)

不是很好,但暂时达到了目的。

最佳答案

听起来您正在进行两件事:

  • 创建 Applicant 记录,我假设您只想为每个用户执行一次 - 如果用户想要申请多个类(class),您不想提示再次查看他们的所有详细信息。

  • 申请人类(class)相关联。

所以我认为您需要一个更复杂的工作流 - 一个在 session 中存储创建的 Applicant 数据或 id,并根据需要重复使用,或提示输入更多数据的工作流。

无论您是否这样做,修复 View 的方法是停止考虑尝试对所有内容使用 ModelFormview_course View 不允许人们编辑关于他们的Applicant 记录的所有内容——它不允许他们设置/取消设置他们的整个类(class)列表。所以使用 ModelForm 来设置 courses 是不合适的。相反,您需要使用 Applicant API that has been created for you by the ORM .

在你的 View 代码中,我假设你有类似的东西:

course = Course.objects.get(slug=slug)

您需要将此类(class)添加到申请人:

applicant = form.save()
applicant.courses.add(course)

applicant 对象将从 form.save() 的返回值中检索,或者从我上面提到的 session 中检索。

关于python - Django session 中的当前字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27600647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com