Я создаю веб-приложение django, чтобы клиенты могли зарегистрироваться на курсы. На странице «обучение» перечислены все курсы. Пользователи нажимают на курс, чтобы получить более подробную информацию и подать заявку на этот курс. Модель конечно выглядит следующим образом:Текущие значения полей из сеанса в Django
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)
Когда пользователь нажимает на ходу детали этого курса оказываются в view и ModelForm также отображается для процесса приложения. Вид выглядит следующим образом:
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})
Все из вышеперечисленных работ, и я могу просмотреть список пользователей в моем Джанго администратора, как они применяются. То, что я хотел бы сделать, - собрать конкретную информацию о курсе, к которому они обращаются, и связать это с каждым пользователем. Я надеялся, что отношения ManyToMany в модели «Курс» помогут, но если я включу его в визуализированную форму, он просто даст возможность выбрать любой курс.
Я получаю куда-нибудь с запросами, такими как Course.objects.all()
, но мне нужно отфильтровать это на текущих значениях из «Курса» в представлении. Есть ли текущая команда или аналогичные данные, которые хранятся в текущем сеансе?
Я использую Django 1.7 и MySQL в качестве базы данных.
Разъяснения
Я хочу, чтобы отобразить минимум на форме пользователь заполняет, чтобы облегчить процесс подачи заявки. Поэтому требуются только first_name, last_name и email. Я хочу, чтобы эта информация была связана с курсом, который пользователь просматривает в настоящее время, поэтому эти значения автоматически завершаются и не отображаются пользователем.
Что касается многих экземпляров-кандидатов в db, это не так, как работают отношения ManyToMany? На моей странице администратора я хочу, чтобы вы могли нажимать на пользователей и просматривать курсы, на которые они подписались, а также иметь возможность щелкнуть по курсу, чтобы узнать, сколько пользователей было применено. Моя страница администратора еще нигде не приближается, но я хотел иметь возможность сохранить текущую информацию, прежде чем беспокоиться об этом. Вот что администратор выглядит следующим образом:
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 объектов. Итак, админ.пй выглядит следующим образом:
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)
Для получения более подробной информации о соответствующем заявителя объекта (в разделе Курс администратора) или объекта курса (в разделе заявитель администратора) я добавил следующую функцию в модели заявителя (и соответствующая модели курса):
def __unicode__(self):
return u'%s %s %s' % (self.first_name, self.last_name, self.email)
Невероятно, но служит своей целью на данный момент.
Я не совсем понимаю, что вы хотите здесь сделать. Есть ли что-нибудь, что вы на самом деле хотите отобразить в форме, или это просто, что вы хотите установить курс, на который они подают заявку вместе с информацией о заявителе? –
И так как ваша форма предназначена для модели-заявителя, как вы управляете тем же пользователем, подписывающимся на несколько курсов? Кажется, что им нужно будет ввести все свои данные для каждого курса, и у вас будет несколько объектов Applicant для них в вашем db. –
Что касается вашего редактирования, то это абсолютно не относится к отношениям «многие ко многим». У вас должен быть * один экземпляр каждого заявителя и * один экземпляр каждого курса, но у каждого заявителя может быть много курсов, и у каждого курса может быть много претендентов. Ваши модели правильно настроены для этого, но ваш вид и форма не являются. –