0

どうすればいいですか?私はDjangoが初めてです。私はすでにたくさん読みましたが、まだ私には理解できません。被験者登録モデルを作成しています。そして、私はそれをこのようにフィルタリングしたかった:

Student_id が存在する場合、サブジェクトとカリキュラムタームを検索すると、存在する場合は「既に存在します」というエラー メッセージが表示されます。それ以外の場合は、エントリが保存されます。

ここに私のmodel.pyがあります

class SubjectsEnrolled(models.Model):
    student =  models.ForeignKey(Student)
    STATUS = (
        ('1', 'Passed'),
        ('2', 'Failed'),
        ('3', 'No Grade'),
        ('4', 'Incomplete'),
    )
    subject = models.ForeignKey(Subject)
    grade = models.DecimalField(max_digits=4, decimal_places=2, blank=True, null=True)
    status = models.CharField(max_length=2, choices=STATUS, blank=True, null=True)
    schoolterm = models.ForeignKey(SchoolTerm)

そして、ここに私のadmin.pyがあります

class SubjectsEnrolledAdmin(admin.ModelAdmin):
    list_display = ('student', 'get_student_lastname', 'get_student_firstname', 'get_student_course', 'subject', 'grade', 'status','schoolterm')

    search_fields = ['student__student_id','student__last_name', 'student__course__course', 'schoolterm__schoolterm']

    def get_student_lastname(self, instance):
        return instance.student.last_name
    get_student_lastname.short_description = 'Last Name'

    def get_student_firstname(self, instance):
        return instance.student.first_name
    get_student_firstname.short_description = 'First Name'

    def get_student_course(self, instance):
        return instance.student.course
    get_student_course.short_description = 'Course'

これについて答えてほしい...ありがとう...

4

1 に答える 1

0

一意性については、モデル メタ オプションの unique_together を使用します。あなたのモデルでは:

class SubjectsEnrolled(models.Model):
    student =  models.ForeignKey(Student)
    ...
    schoolterm = models.ForeignKey(SchoolTerm)

    class Meta:
        unique_together = (("student", "schoolterm"),)

https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.unique_together注: manyToManyField を unique_together に含めることはできません!

unique_together の代わりに、独自のカスタム フォームを作成できます。利点は、カスタム エラー メッセージを表示し、manyToMany であっても複数の非標準検証を実行できることです。

1) admin.py でカスタム フォームを作成します。

class SubjectsEnrolledForm(forms.Form):
    def clean(self):
        cleaned_data = super(SubjectsEnrolledForm, self).clean()
        student = cleaned_data.get("student")
        schoolterm = cleaned_data.get("schoolterm")
        if student and schoolterm:
            # Only do something if both fields are valid so far.
            if student in schoolterm.student_set.all():
                raise forms.ValidationError("Student %s in %s term!"%
                                                 (student, schoolterm))

        # Always return the full collection of cleaned data.
        return cleaned_data

2) Admin.py で ModelAdmin を作成し、フォームを指定します。

class SubjectsEnrolledAdmin(admin.ModelAdmin):
    form = SubjectsEnrolledForm
    ...

注: unique_together は db レベルにあります。勝手な入力はできません。フォームは検証レベルです。したがって、de db は望ましくないエントリを受け入れることができます。しかし、このフォームはそれらを送信しません。ただし、他の形式またはロジックは可能です。

于 2013-05-03T12:41:23.403 に答える