Django-Admin TabularInline在保存之前修改内联项属性

时间:2019-03-26 00:25:31

标签: django django-admin django-admin-tools django-admin-actions

嗨,我需要能够将当前用户添加到内联对象中,因为它正在被保存或修改。我正在使用django-admin仪表板,因为此应用程序不是面向公众的。

class Med(models.Model):
    generic_name = models.CharField(max_length=33)
    last_updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL)

    def save_model(self, request, obj, form, change):
            try:
                obj.last_updated_by = request.user
            except AttributeError:
                obj.last_updated_by = None
            super().save_model(request, obj, form, change)

class Comment(models.Model):
    text = models.TextField(("Comment"), max_length = 1000, null=False)
    med = models.ForeignKey(Med, related_name="comments", on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL)

    def save_model(self, request, obj, form, change):
        obj.user = request.user
        super().save_model(request, obj, form, change)

class CommentInline(admin.TabularInline):
    model = Comment
    extra = 0

class Med(admin.ModelAdmin):
    inlines = (CommentInline,)

我也尝试覆盖save_related函数,但是似乎其中包含的CommentFormSet对象是全部对象,而不仅仅是被修改或保存的对象:

'_queryset': <QuerySet [<Comment: test>, <Comment: another test>]>,

关于该主题的一些SO帖子过时,并且也没有足够的信息来推断有效的save_related实现。

2 个答案:

答案 0 :(得分:0)

我认为您要寻找的替代方法是save_formset。此方法在AdminModel中的每个内联调用一次,并保存内联对象。

您可以这样使用它:

class Med(admin.ModelAdmin):
    inlines = (CommentInline,)

    def save_formset(self, request, form, formset, change):
        for inline_form in formset.forms:
            if inline_form.has_changed():
                inline_form.instance.user = request.user
        super().save_formset(request, form, formset, change)

这会将当前用户添加到正在修改的对象中。

答案 1 :(得分:0)

抬起头,此解决方案也对我有用:

if (rxBleDevice.connectionState != RxBleConnection.RxBleConnectionState.CONNECTED) {

 // Have your charUUID ready. Might need extra null checks for rxBleDevice
 val charUUID = rxBleDevice.bluetoothDevice.uuids[0].uuid

 rxBleDevice!!.establishConnection(false) ?
  .doOnNext {
   _ -> Log.d("Device: ", "Connection Established")
  } ?
  .flatMapSingle {
   rxBleConnection -> rxBleConnection.readCharacteristic(charUUID)
  } ? .subscribe({
   count ->
   // count should be in bytes
   println("OUTPUT: $count")

  }, {
   throwable ->
   Log.d("ERROR: ", "$throwable")
  })

}