簡體   English   中英

從其他形式的Django管理員獲取字段的值

[英]get value of field from other form django admin

我只是想在django admin中的用戶(管理員)之間構建一個小型電子郵件應用程序,所以我成功地使用戶發送和接收消息,下一步:用戶應該能夠回復收到的消息。 只是我以indox形式添加了“回復”按鈕以將其重定向到發件箱形式,現在的問題是如何在請求中添加to:mail?

我的模型

class Mail(models.Model):
from_user = models.ForeignKey(settings.AUTH_USER_MODEL,
                              verbose_name=_('From User'),
                              related_name='sent_mails')
to_user = models.ForeignKey(settings.AUTH_USER_MODEL,
                            verbose_name=_('To User'),
                            related_name='recieved_mails')
subject = models.CharField(_('Subject'), max_length=255)
body = models.TextField(_('Body'))
read = models.BooleanField(default=False)

created_at = models.DateTimeField(auto_now_add=True)
last_update = models.DateTimeField(auto_now=True)

admin.py

class Inbox(Mail):

     class Meta:
         app_label = 'internal_mails'
         proxy = True
         verbose_name = _("Inbox")
         verbose_name_plural = _("Inbox")


class Outbox(Mail):

    class Meta:
        app_label = 'internal_mails'
        proxy = True
        verbose_name = _("Outbox")
        verbose_name_plural = _("Outbox")

class InboxAdmin(MailAdmin):
    list_display = ('id', 'from_user', 'subject',)
    exclude = ('read',)

    def get_queryset(self, request):
       queryset = super(InboxAdmin, self).get_queryset(request)
       return queryset.filter(to_user=request.user)

    def has_add_permission(self, request, obj=None):
        return False

    def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
        response = super(InboxAdmin, self).changeform_view(
            request, object_id=object_id,
            form_url=form_url, extra_context=extra_context
        )
        if isinstance(response, HttpResponseRedirect):
            obj = Mail.objects.get(id=object_id)
            print(obj.from_user)
            response = HttpResponseRedirect('/'.join(response.url.split('/')[:-2] + ['outbox/add/']))
        else:
           obj = Inbox.objects.get(id=object_id)
           obj.read = True
           obj.save()
        return response


class OutboxAdmin(MailAdmin):
    list_display = ('id', 'to_user', 'subject',)
    list_filter = ('to_user',)
    exclude = ('from_user', 'read',)

    def get_queryset(self, request):
        queryset = super(OutboxAdmin, self).get_queryset(request)
        return queryset.filter(from_user=request.user)

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


admin.site.register(Inbox, InboxAdmin)
admin.site.register(Outbox, OutboxAdmin)

這是我解決問題的方法,我在url中發送了用戶ID,例如:127.0.0.1:8000/en/outbox/add/?to_user=1

單擊“答復”按鈕時,它將重定向到具有用戶ID的發件箱

InboxAdmin類中

    if isinstance(response, HttpResponseRedirect):
        obj = Mail.objects.get(id=object_id)
        url = reverse("admin:internal_mails_outbox_add")
        return HttpResponseRedirect(url + "?to_user=" + str(obj.from_user.id))

補充說明,如果您需要了解如何在Django-admin中反轉URL,則可能需要閱讀以下內容:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#reversing-admin-urls

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM