【问题标题】:I would like to use the same view to display or update an object through his django form我想通过他的 django 表单使用相同的视图来显示或更新对象
【发布时间】:2018-12-23 17:20:13
【问题描述】:

有人可以帮我解决这个问题吗?

models.py

@autoconnect
class Event(models.Model):
  title = models.CharField(max_length=50, unique=True)
  slug = models.CharField(max_length=100, default=' ', blank=True)
  description = models.CharField(max_length=250, blank=True)
  PrivacityType = ((1, 'Público'), (2, 'Privado'))
  privacity = models.IntegerField(choices=PrivacityType, default=1, blank=True)
  EVENT_TYPE = ((1, 'Deporte'), (2, 'Nutrición'), (3, 'Salud'))
  type = models.IntegerField(choices=EVENT_TYPE, default=1)
  owner = models.ForeignKey(User)
  creation_date = models.DateTimeField(auto_now=True)
  updated_date= models.DateTimeField(auto_now_add=True)
  start = models.DateTimeField(default=datetime.datetime.now())
  end = models.DateTimeField(default=datetime.datetime.now())
  address = models.CharField(max_length=250, default='', blank=True)
  notes = models.CharField(max_length=250, default='', blank=True)

  def __unicode__(self):
    return self.title

  def pre_save(self):
    self.slug = self.title.replace(" ", "_").lower()

forms.py

class EventForm(forms.ModelForm):
  title = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Título'}))
  description = forms.CharField(required=False, widget=forms.TextInput(attrs={'placeholder': 'Descripción'}))
  address = forms.CharField(required=False, widget=forms.TextInput(attrs={'placeholder': 'Lugar'}))
  notes =forms.CharField(required=False, widget=forms.TextInput(attrs={'placeholder': 'Añade tus notas'}))

  class Meta:
    model = event_models.Event
    fields = '__all__'

views.py

class EventUpdateView(LoginRequiredMixin, UpdateView):
  model = events_models.Event
  template_name = 'event.html'
  fields = ['title', 'description']
  slug_field = 'slug'
  slug_url_kwarg = 'slug'
  context_object_name = 'event'

urls.py

url(r'^eventos/(?P<slug>\w+)/$', calendar_views.EventUpdateView.as_view(), name='detail_event'),
url(r'^eventos/nuevo/$', calendar_views.add_event, name='add_event'),

event.html:

{% extends "calendar.html" %}
{% load static %}
{% load calendar_tags %}

{% block event %}

<!-- Event Information Area -->
  <div class="col-md-6 col-lg-6 col-sm-12 col-xs-12 smt-30 xmt-30">
    <div class="map-contacts">
      <!--<form id="contact-form" method="POST">-->
      <form action="{% url 'calendar:detail_event' event_slug=event.slug %}" method="POST">
        {% csrf_token %}

        <!-- Event Form Area -->
        <div class="single-contact-form">
            <div class="contact-box subject">
              <h3>Privacidad</h3>
              {{ event.privacity }}
            </div>
        </div>
        <!-- Event Form Area -->
        <div class="single-contact-form">
            <div class="contact-box subject">
              <h3>Categoría</h3>
              {{ event.type }}
            </div>
        </div>
        <!-- Event Form Area -->
        <div class="single-contact-form">
            <div class="contact-box subject">
              {{ event.title }}
            </div>
        </div>
        <!-- Event Form Area -->
        <div class="single-contact-form">
            <div class="contact-box subject">
              {{ event.description }}
            </div>
        </div>
        <!-- Event Form Area -->
        <div class="single-contact-form">
            <div class="contact-box subject">
              {{ event.address }}
            </div>
        </div>
        <!-- Event Form Area -->
        <div class="single-contact-form">
            <div class="contact-box subject">
              <h3>Inicio</h3>
              {{ event.start }}
            </div>
        </div>
        <!-- Event Form Area -->
        <div class="single-contact-form">
            <div class="contact-box subject">
              <h3>Fin</h3>
              {{ event.end }}
            </div>
        </div>
        <!-- Event Form Area -->
        <div class="single-contact-form">
            <div class="contact-box subject">
              <h3>Privacidad</h3>
              {{ event.notes }}
            </div>
        </div>

        <div class="contact-btn">
            <input type="submit" class="fv-btn" value="Modificar">
        </div>
      </form>
    </div>
  </div>

{% endblock %}

模板调用:

<a href="{% url 'calendar:detail_event' event.slug %}">{{ event.title }}</a>

这是出现的错误。 我该如何解决?

找不到关键字参数“{u'event_slug': u'event_1'}”的“detail_event”。尝试了 1 种模式:[u'calendario/eventos/(?P\w+)/$']

提前致谢。

【问题讨论】:

  • 为什么调用eventos而不是events
  • 我已经翻译好了。它已经更正了。
  • def event(request, event_slug): -> def event(request, event_slug=None):
  • 您是否将 u'event_slug 值传递给 html 中的事件 url
  • 您的eventEventForm

标签: python django django-forms


【解决方案1】:

您的方法行不通,因为您需要event_slug 才能访问您将在其中创建活动的表单。但是 event_slug 直到你创建事件之后才会存在!

通常的解决方案是使用单独的“创建”和“更新”视图。 为此请查看generic editing views。例如,您可以导航到 /event/new/ 以创建一个新事件(没有 slug),然后在 slug 存在后​​转到 /event/(?P&lt;slug&gt;\w+)/ 编辑该事件。

This answer 也应该能帮到你。

【讨论】:

  • 我将在单独的视图中进行,如果我设法修复它,我会写
  • 我正在修改代码,我想要这样的东西:[stackoverflow.com/a/7493320/8000016].我的想法是,如果事件存在,则用对象的信息初始化表单,如果不存在则将其初始化为空。
  • Django 的UpdateView 会自动执行此操作(参见示例,您只需选择要呈现的字段)。你只需要使用/events/(?P&lt;slug&gt;\w+)/(即slug作为关键字而不是event_slug,这样Django就会自动知道要加载哪个对象。所以最终,使用带有上面url路径的UpdateView作为编辑视图,并使用带有/events/new/ 或类似的 CreateView(但没有 slug)。
  • @AlbertoSanmartinMartinez 好的,如果对我的解决方案有帮助,请点赞,如果解决了您的问题,也将其标记为正确
  • 谢谢!!我赞成您的评论,但现在出现其他错误,我在一般问题中发布了修改并实现了错误消息。
猜你喜欢
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
相关资源
最近更新 更多