【问题标题】:How to refresh the form fields and view after a different app update's the database? Django, Python如何在不同的应用程序更新数据库后刷新表单字段并查看?姜戈,蟒蛇
【发布时间】:2020-11-22 18:29:15
【问题描述】:

我有 2 个应用程序,2 个表单,表单 1 中的复选框取决于存储在模型 2 中的值(通过 form2)。 问题是,当我在模型 2(表单 2)中添加一个新对象并转到表单 1 时,复选框不会更新。

我已尽我所能,请让我知道我做错了什么,以及是否有办法做到这一点。

如果是 form-1,则表单字段取决于 QueueStatusModel(不同的应用程序)中存在的“queue_names”的不同值

class NewInvestigatorForm(forms.ModelForm):

queues_queryset = QueueStatusModel.objects.order_by().values('queue_name').distinct()
queue_name_list = []

for i in queues_queryset:
    x = i.get("queue_name")
    queue_name_list.append( (x,x) )
    
active_qs = forms.MultipleChoiceField(
    choices = queue_name_list,
    widget  = forms.CheckboxSelectMultiple,
)

class Meta:
    model = PriorityModel
    fields = [
        'login',
        'core',
        'active_qs',
        'priority'
    ]

这是 form-2,我在其中添加了一个新的“queue_name”:

class AddNewQueue(forms.ModelForm):

queue_name = forms.CharField(widget=forms.TextInput(attrs={"placeholder":"Queue Name", "size":60}))
class Meta:

    model = QueueStatusModel
    fields = [
        'queue_name'
    ]

def clean_queue_name(self, *args, **kwargs):
    queue_name = self.cleaned_data.get("queue_name")

    if " " in queue_name:
        raise forms.ValidationError("Queue names cannot contain space")
    else:
        return queue_name

队列状态模型,存储队列相关信息:

class QueueStatusModel(models.Model):

queue_name = models.CharField(max_length=100)
volume = models.IntegerField()
active_investigators = models.IntegerField()

新的 Investigator 相关模型:

class PriorityModel(models.Model):

login = models.CharField(max_length=15)
core = models.CharField(max_length=20, choices=[("", ""), ("", "")])


active_qs = models.CharField(max_length=500)

priority = models.CharField(max_length=500,
                        choices=[("SLA","SLA"), ("volume","Volume"), ("custom","Custom")]
                        )
custom_priority = models.TextField(blank=True)

class Meta:
    ordering = ('core', '-login')

【问题讨论】:

    标签: python-3.x django django-forms


    【解决方案1】:

    想出一个使用 JavaScript 的解决方案。 现在我将“active_qs”字段渲染为隐藏在 HTML 中,并使用 javascript 创建复选框,其值作为从视图传递的所有队列。 我存储在数组中的所有选定复选框的值。当我在表单上按 Submit 时,'active_qs' 隐藏文本字段的值会使用数组更新,然后我可以在 form.cleaned_data 中访问它。

    使用 django 查询集数据创建复选框的代码:

    var available_queues = {{ queue_set_JS|safe }}
    for (available_q of available_queues){
        const node = document.createElement("li");
        node.innerHTML = '<input type="checkbox" id="id-' + available_q.queue_name + '" class="queue_li" value="' + available_q.queue_name + '"><label for="id-' + available_q.queue_name + '">'+ available_q.queue_name +'</label>';
        qs_ul.append(node) 
    }
    

    //qs_ul 是我在 HTML 模板中创建的 ul,此复选框将被推送为 li

    在表单上单击提交时运行 JS 函数,您可以使用:

            <input type="submit" class="form-submit-btn" onclick="my_func2();" value="Submit">
    

    你可以在my_func2()中更新'active_qs'隐藏字段的值

    function my_func2(){
        active_qs_text_field.setAttribute("value", final_queue_list.join(", "))
    }
    

    active_qs_text_field 之前定义为:

        const active_qs_text_field = document.querySelector("#id_active_qs")
    

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 2016-04-29
      • 2011-12-24
      • 1970-01-01
      • 2012-05-29
      • 2018-03-02
      • 2015-07-18
      • 2011-03-14
      • 1970-01-01
      相关资源
      最近更新 更多