# 7.4.FormModel

## FormModel

organization/form.py

```python
import re

from django import forms

from operation.models import UserAsk


class UserAskForm(forms.ModelForm):
    class Meta:
        model = UserAsk
        fields = ['name', 'mobile', 'course_name']

    def clean_mobile(self):
        """
        验证手机号码合法性
        :return:
        """
        mobile = self.cleaned_data['mobile']
        regex_mobile = '^1(3[0-9]|4[5,7]|5[0,1,2,3,5,6,7,8,9]|6[2,5,6,7]|7[0,1,7,8]|8[0-9]|9[1,8,9])\d{8}$'
        p = re.compile(regex_mobile)
        if p.match(mobile):
            return mobile
        else:
            raise forms.ValidationError('手机号码非法', code='mobile_invalid')
```

返回json对象

organization/views.py

```python
from django.http import HttpResponse
...

class AddUserAskView(View):
    """
    用户添加咨询
    """

    def post(self, request):
        user_ask_form = UserAskForm(request.POST)
        if user_ask_form.is_valid():
            user_ask = user_ask_form.save(commit=True)
            return HttpResponse('{"status": "success"}', content_type='application/json')
        else:
            return HttpResponse('{"status": "fail", "msg": {0}}'.format(user_ask_form.errors),
                                content_type='application/json')
```

templates/org-list.html

```markup
<div class="right companyright">
    <div class="head">我要学习</div>
    <form class="rightform" id="jsStayForm">
        <div>
            <img src="/static/images/rightform1.png"/>
            <input type="text" name="name" id="companyName" placeholder="名字" maxlength="25"/>
        </div>
        <div>
            <img src="/static/images/rightform2.png"/>
            <input type="text" name="mobile" id="companyMobile" placeholder="联系电话"/>
        </div>
        <div>
            <img src="/static/images/rightform3.png"/>
            <input type="text" name="course_name" id="companyAddress" placeholder="课程名" maxlength="50"/>
        </div>
        <p class="error company-tips" id="jsCompanyTips"></p>
        <input class="btn" type="text" id="jsStayBtn" value="立即咨询 >"/>
        {% csrf_token %}
    </form>
</div>


<script>
    $(function () {
        $('#jsStayBtn').on('click', function () {
            $.ajax({
                cache: false,
                type: "POST",
                url: "{% url 'org:add_ask' %}",
                data: $('#jsStayForm').serialize(),
                async: true,
                success: function (data) {
                    if (data.status == 'success') {
                        $('#jsStayForm')[0].reset();
                        alert("提交成功")
                    } else if (data.status == 'fail') {
                        $('#jsCompanyTips').html(data.msg)
                    }
                },
            });
        });
    })
</script>
```

## url include

hello\_django/urls.py

```python
from django.urls import path, include
...

urlpatterns = [
    ...
    # 课程机构
    path('org/', include('organization.urls')),
]
```

organization/urls.py

```python
from django.urls import path

from organization.views import OrgView

app_name = 'org'
urlpatterns = [
    # 课程机构首页
    path('list/', OrgView.as_view(), name='org_list'),
]
```

templates/index.html

```markup
<a href="{% url 'org:org_list' %}">授课机构</a>
```

视频播放 video js

获取请求url实现菜单选中

```python
{% if request.path|slice:'7' == '/course' %}class = actibe {% endif %}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://moluo.gitbook.io/notes/bian-cheng-xue-xi/python/django/7.4.formmodel.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
