基于与登录用户的关系限制表格选项

时间:2014-01-28 16:28:19

标签: django django-models django-forms django-queryset

我已经找到了几个在管理页面上执行此操作的解决方案,或者使用基于其他字段的javascript动态过滤,但我似乎无法将这些主题的想法拼凑起来以修复我想要的内容。

我有以下内容:

  • 自定义用户模型
  • 一个模型,称之为阳光,它将自定义用户模型作为外键(最终这将是多对多,但这是一个完全不同的动物)
  • 一个模型,称之为ray,它具有阳光作为外键

我想:

  • 登录用户的表单(管理员)添加光线,其中仅在页面加载时,阳光的唯一选项是与登录用户相关的太阳神。

代码

Models.py:

    class SunshineUser(AbstractBaseUser):
        email = models.EmailField(
            verbose_name='email address',
            max_length=320, 
            unique=True
            )

        USERNAME_FIELD = 'email'

        name = models.CharField(max_length=150)

        is_active = models.BooleanField(default=True)

        is_admin = models.BooleanField(default=False)

        REQUIRED_FIELDS = ['name']

        objects = SunshineUserManager()

        def get_full_name(self):
            # The user is identified by their email address
            return self.email

        def get_short_name(self):
            # The user is identified by their name
            return self.name

        def __str__(self):
            return self.email

        def has_perm(self, perm, obj=None):
            return True

        def has_module_perms(self, app_label):
            return True

        @property
        def is_staff(self):
            return self.is_admin

    class Sunshine(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL)
        label = models.CharField(max_length=150)
        SUNSHINE_TYPES = (
            ('R', 'Rain'),
            ('SH', 'Shine'),
            ('C', 'Clouds')
        )
        sunshine_type = models.CharField(max_length=2, choices=METER_TYPES)
        POSSIBLE_UNITS = (
            ('CCF', 'Hundreds of Cubic Feet'),
            ('GAL', 'Gallons')
        )
        units = models.CharField(max_length=3, choices=POSSIBLE_UNITS)

        def get_full_name(self):
            return self.label

        def get_short_name(self):
            return self.label

        def __str__(self):
            return self.label


    class Ray(models.Model):

        sunshine = models.ForeignKey(Sunshine)
        ray_amount = models.DecimalField(max_digits=15, decimal_places=5,
         validators=[MinValueValidator(0)])
        timestamp = models.DateTimeField()

        def get_full_name(self):
            return self.timestamp

        def get_short_name(self):
            return self.timestamp

        def __str__(self):
            return self.timestamp

Views.py:

def addray(request):
"""
processing for addreading
"""
if request.method == "POST":
    form = RayCreationForm(request.POST)
    if form.is_valid():
        form.save()
        # redirect, or however you want to get to the main view
        return HttpResponseRedirect('/personal/dashboard')
else:
    form = RayCreationForm()
    #form.sunshine.queryset = Sunshine.objects.filter(user_id=request.user.id)

return render(request, 'personal/addray.html', {'form': form})

Forms.py:

我现在所拥有的只是一个基本形式,因为我在视图中的其他地方尝试了注释掉的行以及其他一些内容,但没有任何效果。

class RayCreationForm(forms.ModelForm):
class Meta:
    model = Ray
    fields = ['sunshine', 'ray_amount', 'timestamp']

1 个答案:

答案 0 :(得分:2)

在其他地方,您可以尝试:

,而不是注释掉的行
form.fields['sunshine'].queryset = Sunshine.objects.filter(user_id=request.user.id)

此处共享在ModelChoiceField中过滤初始查询集的其他方法:https://stackoverflow.com/a/5329761/232649

相关问题