Django管理表单 - 如何动态更改选择选项? [英] Django admin form - how to change select options dynamically?

查看:151
本文介绍了Django管理表单 - 如何动态更改选择选项?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个模型:

  class City(models.Model):
name = models.CharField max_length = 50)
slug = models.SlugField(max_length = 50)


class CityNews(models.Model):
title = models.CharField(max_length = 100)
slug = models.SlugField(max_length = 100)
add_date = models.DateTimeField(auto_now = False,auto_now_add = True,editable = False)
content = models.TextField()
city = models.ForeignKey(City)

我的每个用户已连接到1个城市。我希望他只向他所在的城市添加新闻。但是,超级明星必须有可能向每个城市添加消息。
如何更改CityNews中的city字段,只显示用户连接的城市?我可以编写自定义的ModelForm,但是如何在那里检查user_city并更改其查询集?

解决方案

这样做的一个明显的方法是使用 Modelfield_for_foreignkey()在ModelAdmin上的方法。



所以如果你的models.py看起来像这样:



来自django.db导入模型的$ $ $ $ $ $ $ $ $

$ b class City(models.Model):
name = models.CharField(max_length = 50)

def __unicode __(self):
return self.name

class CityNews(models.Model)
added_by = models.ForeignKey(User)
city = models.ForeignKey(City)
title = models.CharField(max_length = 100)
content = models.TextField()

class UserExtra(models.Model):
user = models.ForeignKey(User)
city = models.ForeignKey(City)

然后您的admin.py可能如下所示:

  from django.contrib import form $ form 
from formtesting.models import City, CityNews,UserExtra
from django.forms.models import ModelChoiceField
from django.contrib.auth.models import User

class CityAdmin(admin.ModelAdmin):
pass

admin.site.register(City,CityAdmin)

class CityNewsAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self,db_field,request,** kwargs ):
如果db_field.name ==city:
如果request.user.is_superuser:
queryset = City.objects.all()
else:
queryset = City.objects.filter(userextra__user = request.user)
return ModelChoiceField(queryset,initial = request.user)
elif db_field.name ==added_by:
如果请求。用户.is_superuser:
queryset = User.objects.all()
else:
queryset = User.objects.filter(id = request.user.id)
return ModelChoiceField(queryset ,initial = request.user)
else:
return super(CityNewsAdmin,self).formfield_for_foreignkey(db_field,
请求,** kwargs)

admin.site .net($ new $)

class UserExtraAdmin(admin.ModelAdmin):
pass

admin.site.register(UserExtra,UserExtraAdmin)


I have 2 models:

class City(models.Model):
    name = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50)


class CityNews(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)
    add_date = models.DateTimeField(auto_now=False, auto_now_add=True, editable=False)
    content = models.TextField()
    city = models.ForeignKey(City)

My each user has been connected with 1 city. I want him to add news only to the city he id connected with. But superadmin must have possibility to add news to each city. How can I change 'city' field in CityNews, that they show only the city that user is connected with? I can write custom ModelForm but how can I check user_city there and change its queryset?

解决方案

One obvious way of doing this is to utilize the formfield_for_foreignkey() method on the ModelAdmin.

So if your models.py looks like this:

from django.db import models
from django.contrib.auth.models import User

class City(models.Model):
    name = models.CharField(max_length=50)

    def __unicode__(self):
        return self.name

class CityNews(models.Model):
    added_by = models.ForeignKey(User)
    city = models.ForeignKey(City)
    title = models.CharField(max_length=100)
    content = models.TextField()

class UserExtra(models.Model):
    user = models.ForeignKey(User)
    city = models.ForeignKey(City)

Then your admin.py could look like this:

from django.contrib import admin
from formtesting.models import City, CityNews, UserExtra
from django.forms.models import ModelChoiceField
from django.contrib.auth.models import User

class CityAdmin(admin.ModelAdmin):
    pass

admin.site.register(City, CityAdmin)

class CityNewsAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "city":
            if request.user.is_superuser:
                queryset = City.objects.all()
            else:
                queryset = City.objects.filter(userextra__user=request.user)
            return ModelChoiceField(queryset, initial=request.user)
        elif db_field.name == "added_by":
            if request.user.is_superuser:
                queryset = User.objects.all()
            else:
                queryset = User.objects.filter(id=request.user.id)
            return ModelChoiceField(queryset, initial=request.user)
        else:
            return super(CityNewsAdmin, self).formfield_for_foreignkey(db_field, 
                                                              request, **kwargs)

admin.site.register(CityNews, CityNewsAdmin)

class UserExtraAdmin(admin.ModelAdmin):
    pass

admin.site.register(UserExtra, UserExtraAdmin)

这篇关于Django管理表单 - 如何动态更改选择选项?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆