Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 限制基于其他字段的外部字段的选择_Django - Fatal编程技术网

Django 限制基于其他字段的外部字段的选择

Django 限制基于其他字段的外部字段的选择,django,Django,型号 from django.db import models from test.test_imageop import MAX_LEN class Student(models.Model): first_name = models.CharField(max_length=128) last_name = models.CharField(max_length=128) mail_adress = models.EmailField(max_length=128)

型号

from django.db import models
from test.test_imageop import MAX_LEN

class Student(models.Model):
    first_name = models.CharField(max_length=128)
    last_name = models.CharField(max_length=128)
    mail_adress = models.EmailField(max_length=128)

    def __unicode__(self):
        return self.first_name+" "+self.last_name

class Course(models.Model):
    name = models.CharField(max_length=128)
    description = models.CharField(max_length=256)
    students=models.ManyToManyField(Student)
    def __unicode__(self):
        return self.name


# Create your models here.    
class Task(models.Model):
    course= models.ManyToManyField(Course)
    name = models.CharField(max_length=128)
    description = models.CharField(max_length=256)
    students=models.ManyToManyField(Student,limit_choices_to={'course' : Course},blank=True)
    def __unicode__(self):
        return self.name
管理

from django.contrib import admin
from .models import Student
from .models import Course
from .models import Task

class StudentAdmin(admin.ModelAdmin):
        pass
admin.site.register(Student,StudentAdmin)

class CourseAdmin(admin.ModelAdmin):
        pass
admin.site.register(Course,CourseAdmin)

class TaskAdmin(admin.ModelAdmin):
       pass
admin.site.register(Task,TaskAdmin)
# Register your models here.

我的想法是,当我创建一个任务并选择一门课程时,只有分配给这门课程的学生才能被选择,并且我为其他成员尝试了很多答案,但在这种情况下不起作用,如果你有想法,请帮助我



您需要在表单中筛选学生。在管理方面,此黑客可能会有所帮助:

class TaskAdmin(admin.ModelAdmin):

    def get_form(self, request, obj=None, **kwargs):
        request._obj_ = obj
        return super(TaskAdmin, self).get_form(request, obj, **kwargs)

    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
        field = super(TaskAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

        if db_field.name == 'students':
            if request._obj_ is not None:
                field.queryset = field.queryset.filter(id__in=request._obj_.course.students.all())
            else:
                field.queryset = field.queryset.none()

        return field
对于您的
ModelForm
s:

class TaskForm(forms.ModelForm):

    def __init__(self, course, *args, **kwargs):
        super(TaskForm, self).__init__(*args, **kwargs)
        self.fields['students'].queryset = course.students

    class Meta:
        model = Task
        fields = '__all__'
然后,在实例化表单时,您必须通过课程:

form = TaskForm(course, request.POST) 

您需要在admin.py中使用
formfield\u for\u manytomy
。文档在这里