Tweaked forms for prepopulated read-only slot fields

This commit is contained in:
Sebastian 2017-03-19 17:03:11 +01:00
parent 4e7b0207d6
commit c5d690d7f9
3 changed files with 57 additions and 1 deletions

View File

@ -3,14 +3,22 @@ from django.contrib import admin
from taggit_helpers.admin import TaggitListFilter, TaggitTabularInline
from roms.models import Rom, RomFile
from roms.forms import RomFileForm, RomFileInlineFormSet
from gulashromstore.settings import SLOT_COUNT
class RomFileInline(admin.TabularInline):
model = RomFile
form = RomFileForm
formset = RomFileInlineFormSet
fields = ('slot', 'binary')
can_delete = False
max_num = SLOT_COUNT
min_num = SLOT_COUNT
class RomAdmin(admin.ModelAdmin):
list_display = ('name', 'approved', 'tag_list')
list_filter = [TaggitListFilter]

42
roms/forms.py Normal file
View File

@ -0,0 +1,42 @@
from django.forms import Field, Widget, ModelForm
from django.forms.models import BaseInlineFormSet
from roms.models import RomFile
class ReadOnlyWidget(Widget):
def render(self, name, value, attrs):
final_attrs = self.build_attrs(attrs, name=name)
if hasattr(self, 'initial'):
value = self.initial
return "%s" % (value or '')
def _has_changed(self, initial, data):
return False
class ReadOnlyField(Field):
widget = ReadOnlyWidget
def __init__(self, widget=None, label=None, initial=None, help_text=None):
super(ReadOnlyField, self).__init__(self, label=label, initial=initial,
help_text=help_text, widget=widget)
def clean(self, value, initial):
self.widget.initial = initial
return initial
class RomFileForm(ModelForm):
slot = ReadOnlyField()
class Meta:
model = RomFile
fields = ['binary']
class RomFileInlineFormSet(BaseInlineFormSet):
def __init__(self, *args, **kwargs):
super(RomFileInlineFormSet, self).__init__(*args, **kwargs)
# Check that the data doesn't already exist
if not kwargs['instance'].romfile_set.all():
self.initial = [{'slot' : i} for i in range(1, SLOT_COUNT+1)]
self.extra = SLOT_COUNT

View File

@ -38,6 +38,9 @@ class Rom(models.Model):
return json
def __str__(self):
return "Rom %s" % self.name
class RomFile(models.Model):
@ -48,3 +51,6 @@ class RomFile(models.Model):
class Meta:
unique_together = ('rom', 'slot')
def __str__(self):
return "RomFile %s %d" % (self.rom.name, self.slot)