【问题标题】:Show django form in a designed page在设计的页面中显示 django 表单
【发布时间】:2021-11-17 18:51:50
【问题描述】:

你好吗? 我是 Django 的新手。我设计了一个页面,我想在一个设计良好的 HTML 页面中显示一个 django 表单(编辑或创建)。但我不知道怎么做。

这是我的所有者方法:

class OwnerUpdateView(LoginRequiredMixin, UpdateView):
"""
queryset to the requesting user.
"""
def get_queryset(self):
    print('update get_queryset called')
    """ Limit a User to only modifying their own data. """
    qs = super(OwnerUpdateView, self).get_queryset()
    return qs.filter(user=self.request.user)


class OwnerCreateView(LoginRequiredMixin, CreateView):
"""
Sub-class of the CreateView to automatically pass the Request to the Form
and add the owner to the saved object.
"""

# Saves the form instance, sets the current object for the view, and redirects to get_success_url().
def form_valid(self, form):
    print('form_valid called')
    object = form.save(commit=False)
    object.user = self.request.user
    object.save()
    return super(OwnerCreateView, self).form_valid(form)

这是我的观点.py

class TaskUpdateView(OwnerUpdateView):
    model = Task
    fields = ["title", "text", "endDate"]

class TaskCreateView(OwnerCreateView):
    model = Task
    fields = ["title","text","status","endDate"]

这是我的 urls.py:

app_name='task'
urlpatterns = [
    path('', views.TaskListView.as_view(), name='all'),
    path('task/<int:pk>/', views.TaskDetailView.as_view(), name='detail'),
    path('task/create', views.TaskCreateView.as_view(success_url=reverse_lazy('task:all')), name='task_create'),
    path('task/update/<int:pk>', views.TaskUpdateView.as_view(success_url=reverse_lazy('task:all')),
         name='task_update'),
    path('task/delete/<int:pk>', views.TaskDeleteView.as_view(success_url=reverse_lazy('task:all')),
         name='task_delete'),

    path("accounts/login/", views.login, name='login'),
    path("accounts/logout/", views.logout, name='logout'),

]

这是models.py:

class Task(models.Model):
    title=models.CharField(max_length=250)
    text=models.TextField()
    user=models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=False)
    status=models.ForeignKey('Status',on_delete=models.SET_NULL,null=True)
    startDate=models.DateTimeField(auto_now_add=True)
    endDate=models.DateField(null=True)

    def __str__(self):
        return self.title

class Status(models.Model):
    name=models.CharField(max_length=250)

    def __str__(self):
        return self.name

这就是这两个函数起作用的地方:

{%extends 'base.html'%}
{% block content %}
  <form action="" method="post">
    {% csrf_token %}
    <table>{{ form.as_table }}</table>

    <input type="submit" value="Submit">
{#    <input type="submit" onclick="window.location='{% url 'project:all' %}' ; return false;" value="Cancel">#}
  </form>
{% endblock %}

如何分离此表单的每个元素并将其放入设计更好的页面中? 谢谢

【问题讨论】:

    标签: django django-rest-framework django-forms


    【解决方案1】:

    有两种方式:

    选项 1:

    遍历表单字段并单独呈现它们:

    {% for field in form %}
        <div class="form-group">
            {{ field.errors }}
    
            {{ field.label_tag }} {{ field }}
    
            {% if field.help_text %}
            <span class="form-text">{{ field.help_text|safe }}</span>
            {% endif %}
    
        </div>
    {% endfor %}
    

    See docs 了解更多。

    选项 2:

    您可以手动创建表单输入并为它们提供正确的字段name 属性。这为您提供了更多的控制权,但也需要更多的工作:

    <div class="form-group"
        <input 
            type="text"
            name="title"
            value="{{ form.title.value }}"
            class="form-control {% if form.title.errors %}is-invalid{% endif %}"
        >
        {% if form.title.help_text%}
        <span class="form-text">{{ form.title.help_text|safe }}</span>
        {% endif %}
        <div class="invalid-feedback">{{ form.title.errors }}</div>
    </div>
    
    <!-- now do the same for other fields -->
    
    

    【讨论】:

      猜你喜欢
      • 2010-12-13
      • 2019-11-06
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 2020-11-22
      • 2020-07-11
      相关资源
      最近更新 更多