def save(self, context, using): """ Save context data on using specified database. """ from keops.views import db from keops.db import models from django.db.models import ForeignKey pk = context.get('pk') if 'model' in context: model = context['model'] if isinstance(model, str): model = db.get_model(context) else: model = self.model data = context.get('data') obj = None related = OrderedDict() if pk: obj = model.objects.using(using).get(pk=pk) if data: if isinstance(data, str): data = json.loads(data) obj = obj or model() for k, v in data.items(): try: field = model._admin.get_modelfield(k) if isinstance(field, models.DateField): for format in settings.DATE_INPUT_FORMATS: # TODO adjust on input widget try: v = datetime.datetime.strptime(v, format) break except: pass elif isinstance(field, ForeignKey): k = field.attname elif isinstance(field, models.OneToManyField): related[field] = v continue except: raise setattr(obj, k, v) obj.full_clean() obj.save(using=using) # submit related data for field, v in related.items(): self._save_related(field, v, obj, using) return True, obj
def index(request): using = get_db(request) view_type = request.GET.get("type", "dialog") model = get_model(request.GET) field = request.GET.get("field") pk = request.GET.get("pk") if field: field = getattr(model, field) related = field.related rel_model = related.model content = rel_model._admin.render_form(cols=2, exclude=[related.field.name], state="write") return render( request, "keops/forms/detail_dialog.html", {"header": capfirst(field.verbose_name or field.name), "content": content}, )