동일한 모델의 인라인이 2 개 있습니다.관리자 인라인 이름을 얻는 방법 또는 인라인을 변경하는 방법을 정의하는 방법은 무엇입니까?
class UsersInlineAdmin(GenericTabularInline):
model = CTSportsToCriterias
class TeamsInlineAdmin(GenericTabularInline):
model = CTSportsToCriterias
class CTSportsToCriterias(models.Model):
user_use = models.BooleanField(verbose_name=_('is available to users?'), default=False)
team_use = models.BooleanField(verbose_name=_('is available to teams?'), default=False)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey()
criteria_group = models.ForeignKey(CriteriaGroups, verbose_name=_('criteria group'))
나는 UsersInlineAdmin
(이 경우에 user_use
이 True)에서 항목을 제거하고이 항목도 (team_use
는도 마찬가지입니다) TeamsInlineAdmin
에있는 경우, 장고는 자동으로 TeamsInlineAdmin
인라인에서이 항목을 제거 할 때에 따라 때문에 Django 문서, 코드 :
def save_formset(self, request, form, formset, change):
for obj in formset.deleted_objects:
...
은 모델의 개체를 제공합니다.
if (inline_name == 'UsersInlineAdmin' and not obj.team_use) or \
(inline_name == 'TeamsInlineAdmin' and not obj.user_use):
obj.delete()
: 내 경우 모델이 몇 가지 옵션 (team_use
\ user_use
)를 가질 수 있기 때문에
그래서, 그것은 가능하다 그런 짓을하기 위해 save_formset
에서 inline
이름을 얻으려면?
편집 : 나는 form
를 추가하고 나는 경우에 user
항목을 추가 할 때 team
의 항목이 이미 존재하는 경우, clean()
를 오버라이드 (override)하는 경우는, 장고 True로 DB user_use
에 업데이트하지 않습니다 . 대신 Django는 새로운 레코드를 만듭니다.
# admin
class UsersInlineAdmin(GenericTabularInline):
model = CTSportsToCriterias
form = UserFieldForm
# form
class UserFieldForm(forms.ModelForm):
class Meta:
model = CTSportsToCriterias
def clean(self):
m = super(UserFieldForm, self).clean()
# This trick works ok in case when I want to DELETE user's item,
# so the trick changes in DB 'user_use' to False, if 'team_use' already exists
if m['DELETE'] is True:
try:
qs = CTSportsToCriterias.objects.get(object_id=object_id,
content_type=content_type,
criteria_group=criteria_group,
team_use=True)
m['id'] = qs.pk
m['DELETE'] = m['user_use'] = False
except ObjectDoesNotExist:
pass
# Can not repeate the same trick as above.
# When 'team_use' already exists, I want to change the value 'user_use' of this team's obj to True,
# but the trick as above does not work in this case - Django adds a new row to DB, instead of update
# the existing one.
elif m['DELETE'] is False:
try:
qs = CTSportsToCriterias.objects.get(object_id=object_id,
content_type=content_type,
criteria_group=criteria_group,
team_use=True)
m['id'] = qs.pk
m['DELETE'] = m['user_use'] = False
except ObjectDoesNotExist:
pass
return m
당신은이 양식 수준에서 할 수 있습니까? 예를 들어,'clean()'메소드의 체크를 수행하는'UsersInlineAdmin'과'TeamsInlineAdmin'을위한 폼을 만드십시오. 또는 나는 무엇인가 놓치고 있냐? – makaveli
@makaveli,'Form = UserFieldForm'을'UsersInlineAdmin'에 추가하고'UserFieldForm (forms.ModelForm) 클래스를 작성 하시겠습니까 : class Meta : ... def clean (self) : ... do something .. super (...). clean()'? 나는 이것을 시도하고 clean()이 호출되지 않는다. – TitanFighter
예, 모든 것을 올바르게 수행하면 호출됩니다. :) 나는 오늘 똑같은 것을 썼다. 그리고 그것은 잘 동작한다. 어리석은 질문을하지만, 일단 save 명령을 내리면'clean()'메쏘드가 호출된다는 것을 알고 있습니까? 로드시 호출되지 않습니다. 그러나 15-20 분 후에 나는 당신에게 실제적인 예를 드릴 수 있습니다. – makaveli