проблема с доступом к нескольким значениям с помощью Django - PullRequest
1 голос
/ 04 августа 2011

Я новичок в python и использую django для приложения базы данных студентов. Приложение базы данных ученика должно показывать идентификатор, имя, фамилию, имена субъектов, оценки. Один студент имеет несколько предметов и их оценки. У меня проблема с доступом к нескольким ценностям, которые у ученика есть по нескольким предметам и оценкам.

models.py

class Person(models.Model):
    firstname=models.CharField(max_length=50)
    lastname=models.CharField(max_length=50)

    def __unicode__(self):
        return (self.firstname,self.lastname)


class Marksheet(models.Model):
    subname=models.CharField(max_length=50)
    marks=models.IntegerField(max_length=10)
    person=models.ForeignKey(Person)

    def __unicode__(self):
        return self.subname

views.py

def add_page(request,page_name): # function for creating  the new records
    p1=None
    p2=None
    if request.method=='POST':
        p1=Person(firstname=request.POST['firstname'],lastname=request.POST['lastname'])
        p1.save()
        p2=Marksheet(subname=request.POST.getlist('subnames'),person=Person(person_id))
        p2.save()
    return render_to_response("add.html",{"page_name":page_name})

создание записей Я использую форму в HTML, которая показана ниже ....

Шаблоны add.html

<form method="post" action="/newdcl/{{page_name}}/add/" > {% csrf_token %}
    First name:  <input type="text" name="firstname" /> <br />
    Last name:  <input type="text" name="lastname" /> <br /> 
    Operating System  <input value="os" name="subnames" type="checkbox"><br />
    System Programming <input value="sp" name="subnames" type="checkbox"> <br />
    Maths <input value="maths" name="subnames" type="checkbox"> <br />        
    <input type="submit" value="save" >
</form> 

Может ли кто-нибудь помочь мне в этом ????

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Кажется, ваша проблема заключается в том, как вы пытаетесь создать Marksheet, вы не можете присвоить список значений одному полю, подобному этому.Используя ваши в настоящее время бесформенные, страшные, без проверки, настройки ... вы можете сделать что-то вроде этого -

p1=Person(firstname=request.POST['firstname'], 
          lastname=request.POST['lastname'])
p1.save()
for subname in request.POST.getlist('subnames'):
    new = MarkSheet(subname=subname, person=p1) 
        #no data for marks, must define it to be able to be blank/null
    new.save()

Вам нужно будет добавить blank=True, null=True в поле ваших отметок в вашем models.py, если вынамереваться не иметь никакой начальной отметки.

Пожалуйста, посмотрите на Создание запросов и Формы

0 голосов
/ 05 августа 2011

По моему мнению, это должно быть сделано с использованием отношения «многие ко многим» в Person, а форма должна быть определена как класс формы, потому что у вас нет никакой проверки в вашей форме, и вы пишете некоторый HTML, который может быть сгенерирован путем помещения одной строки кода в шаблон. Я бы сделал это так:

models.py

class Marksheet(models.Model):
    subname=models.CharField(max_length=50)
    marks=models.IntegerField(max_length=10)

    def __unicode__(self):
        return self.subname

class Person(models.Model):
    firstname=models.CharField(max_length=50)
    lastname=models.CharField(max_length=50)
    marksheets = models.ManyToManyField(Marksheet)

    def __unicode__(self):
        return (self.firstname,self.lastname)

forms.py из моделей импорт Person

class PersonForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(PersonForm, self).__init__(*args, **kwargs)
        # by default m2m relation is rendered with SelectMultiple widget -
        # - below line is changing it to checkbox list
        self.fields['marksheets'].widget = forms.CheckboxSelectMultiple()
    class Meta:
        model = Person

views.py

#inside your view function
if request.method == 'POST':
    form = PersonForm(request.POST)
    if form.is_valid():
        form.save()

# pass form to template in render_to_response

add.html

<form method="post" action="/newdcl/{{page_name}}/add/" > {% csrf_token %}
    {{ form }}
    <input type="submit" value="save" >
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...