MFC FormView+ CDHtmlDialog

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC FormView+ CDHtmlDialog相关的知识,希望对你有一定的参考价值。

在mfc中创建一个SDI,让View类从FormView继承,可以往视图窗口拖拽控件,也就是说FormView内置了一个对话框,我想使用CDhtmlDialog来替换这个普通的对话框,这样便于使用html来控制界面,不知道可不可以做到?
如果可以做到的话,该如何做呢?
如果不可以做到的话,应该用什么方法实现这样的效果呢:可以往View内拖控件,可以自定义所拖控件的样式
F

直接用替换恐怕不行,因为CDHtmlDialog不是从视图派生的,如果要用html来控制可以直接从CHtlmView来替代FormView,或者在FormView中放一个Html的控件。

注意:如果只是替换可编辑的那块FRAME,则用对话框是可以替换的,但是此种替换实际上和没有替换是一样的,你无法用来处理CDHtmlDialog特有的功能。

如果你想既有CFORM可以编辑,又有HTML视图可以控制,那就用多视图吧,左边是FORM,右边是HTML。
替换:先把对话框的ID换成原先FORMVIEW的ID,然后在其属性中设置为CHILD,样式设置为NONE。就可以替换原来那一块东西。
参考技术A 就如同你说的,替换为CDHtmlDialog就可以了。ForView和DIalog一样。

FORMVIEW 和 GET

【中文标题】FORMVIEW 和 GET【英文标题】:FORMVIEW and GET 【发布时间】:2018-06-26 22:02:24 【问题描述】:

我正在尝试清理 FORMVIEW,但收效甚微。我有以下表格:

表格...

class BookRequestNumberSearch(forms.Form):

q = forms.IntegerField(required=True)

def __init__(self, *args, **kwargs):
    user = kwargs.pop('user')
    q = kwargs.pop('q', None)
    super(BookRequestNumberSearch, self).__init__(*args, **kwargs)
    self.fields['q'].widget.attrs['class'] = 'name2'

def clean(self):
    cleaned_data = super(BookRequestNumberSearch, self).clean()
    request_number = cleaned_data.get('q')#
    if request_number:
        if Book.objects.filter(request_number__iexact=request_number).exists():
            try:
                Book.objects.get(request_number__iexact=request_number)
                self.add_error('request_number',' Error.')
            except Book.DoesNotExist:
                pass
    return cleaned_data      

还有视图....

class BookRequestNumberSearchView(LoginRequiredMixin,FormView):
    form_class = BookRequestNumberSearch
    template_name = 'Book/book_request_number_search.html'
def get_form_kwargs(self):
    kwargs = super(BookRequestNumberSearchView, self).get_form_kwargs()
    kwargs['user'] = self.request.user
    kwargs['q'] = self.request.GET.get("q")
    return kwargs

def get_initial(self):
    init = super(BookRequestNumberSearchView, self).get_initial()
    init.update('q':self.request.GET.get("q"))
    return init  

还有 HTML

<form method="GET" autocomplete=off action="% url 'Book:procedure_request_number_search_detail' %" >

  <div>
    <h1 class="title">Book Request Number Search</h1>
  </div>

  <div class="section">
     form.q 
  </div>

此代码有效,但我不知道如何让 Django 调用 CLEAN。我怀疑可能是因为我正在做一个 GET the CLEAN 没有得到认可?我下午大部分时间都在玩变奏曲,但无论我做什么,CLEAN 都被忽略了。感谢您的任何想法。

【问题讨论】:

【参考方案1】:

FormView 的工作方式是在 POST 有效数据后调用 FormView 的 form_valid() 方法。因此,您可以向 BookRequestNumberSearchView 添加一个 form_valid 方法,然后您可以在其中访问已清理的表单数据:

class BookRequestNumberSearchView(LoginRequiredMixin,FormView):
    form_class = BookRequestNumberSearch
    template_name = 'Book/book_request_number_search.html'

    def form_valid(self, form):
        print(form.cleaned_data)
        return # should return an HttpResponse

请注意我是如何通过执行form.cleaned_data(根据文档here)访问清理后的数据的。

根据您的代码,我怀疑您可能没有正确使用 clean() 方法。 clean 方法应该简单地处理输入到表单中的数据,并将数据转换为“更干净”的状态。然后,您需要访问干净的数据并根据 form_valid 部分中的数据进行查询。

祝你好运!

您可以查看 FormView 文档here。

【讨论】:

Rohan Varma 感谢您的反馈。有没有更好的方法来通过 GET 方法验证用户输入?我是新手,正在学习。我实际上是在尝试“清理”数据以确保在返回 404 页面之前存在查询值。有没有更好的方法来解决这个问题? 嗨史蒂夫。我建议实际上创建一个单独的搜索结果网页,并拥有自己的视图。 url 可以是 /results。然后,当用户在搜索栏中输入查询时,它应该使用 GET 参数重定向到 /results 页面,如下所示。如果查询是“hog”,它应该重定向到 /results?q=hog 的 url。然后 /results 页面视图可以处理 get 方法并通过执行 request.GET.get(“q”) 从请求中检索 url 参数。然后在视图中,您可以根据查询加载包含必要结果的结果页面。我很乐意通过聊天更详细地解释。 Rohan Varma 是的,让我们有空时在聊天中讨论。谢谢。

以上是关于MFC FormView+ CDHtmlDialog的主要内容,如果未能解决你的问题,请参考以下文章

创建自定义控件并将其加载到 FormView

mfc 单文档 多文档 对话框 区别

C++ MFC SDI 复制/粘贴不起作用

FormView - 指定在 POST 中发送哪些字段

在 FormView 中找不到控件?

FORMVIEW 和 GET