亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于CharField選擇動態生成Django表單

基于CharField選擇動態生成Django表單

慕標琳琳 2021-08-05 15:18:41
我有一個用戶配置文件模型,用于存儲許多第三方 API 密鑰的配置,我正在嘗試確定如何最好地根據用戶所做的選擇動態生成表單。該應用程序僅支持一部分服務,因此我使用CharField(+ CHOICES) 來縮小用戶嘗試為其提交配置的范圍。用戶可以提交任意數量的重復Cloud Service 1項(例如,3 組密鑰)我有這個模型:class ServiceIntegration(models.Model):    profile = models.ForeignKey(        Profile,        on_delete=models.CASCADE    )    CS1 = 'CS1'    CS2 = 'CS2'    SERVICE_CHOICES = (        (CS1, 'Cloud Service 1'),        (CS2, 'Cloud Service 2'),    )    alias = models.CharField(max_length=255)    service = models.CharField(        max_length=255,        choices=SERVICE_CHOICES,        default=CS1    )    config = JSONField()在表單中,用戶有一個下拉列表,其 QuerySet 設置為此模型的對象。當用戶做出選擇時,我想接觸一個端點并在預定位置轉儲一些表單 HTML。據推測,我可以為每個集成設置一個表單,并且只需要一個視圖來接受選擇、查找表單并將其呈現出來(對于將數據發布到該端點也是如此)。根據用戶的選擇動態呈現表單(并接受數據)的最佳選擇是什么?
查看完整描述

1 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

我最終編寫了每個集成實現都繼承自的 BaseService 類,以及每個實現返回的表單,如:


from service_integrations.forms import CloudServiceOneForm


class BaseService(ABC):


    def __init__(self, configuration):

        self.configuration = configuration

        super().__init__()


    @abstractmethod

    def get_form(self):

        pass


    @abstractmethod

    def get_service_name(self):

        pass


    @abstractmethod

    def check(self):

        pass


    @abstractmethod

    def run(self):

        pass



class CloudServiceOne(BaseService):


    def get_service_name(self):

        return 'Cloud Service One' # This should match the CharField Choice


    def get_form(self):

        return CloudServiceOneForm()


    def check(self):

        # Requirements for config go here

        if self.configuration.get('secret_key') and self.configuration.get('access_key'):

            return True

        else:

            return False


    def run(self):

        pass

以及可以從視圖調用以將相關表單傳遞到上下文的實用程序:


from service_integrations.classes import BaseService


def get_service(service):

    # Passes empty configurations to each subclass of BaseService and returns the handler based on the name.

    for cls in BaseService.__subclasses__():

        if cls({}).get_service_name() == service:

            return cls

    return None

然后您可以將表單傳遞到上下文中,例如:


service = get_service('Cloud Service One')

context = {

    'form': service.get_form()

}

return render(request, 'some_template.html', context)


查看完整回答
反對 回復 2021-08-05
  • 1 回答
  • 0 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號