1

这与之前的 mt 问题有关。我已经看过一些类似问题的答案,但我不确定它们如何应用在这里。

我正在尝试使用 GET 方法在 Django Webserver 上创建内容。当我输入以下网址时:

 http://127.0.0.1:8000/maps/createEvent/?name=explosion&reporter=nathaniel&description=something%20exploded&lat=99&lon=99&timestamp=2434253

我收到此错误:

    invalid literal for int() with base 10: 'explosion'
Request Method: GET
Request URL:    http://127.0.0.1:8000/maps/createEvent/?name=explosion&reporter=nathaniel&description=something%20exploded&lat=99&lon=99&timestamp=2434253
Django Version: 1.5.2
Exception Type: ValueError
Exception Value:    
invalid literal for int() with base 10: 'explosion'

这是有问题的网址:

url(r'^createEvent/$', views.createEvent, name='createEvent')  

和视图:

def createEvent(request):
e = Event(request.GET['name'],request.GET['reporter'],request.GET['description'],
           request.GET['lat'],request.GET['lon'],request.GET['timestamp'])
e.save()

return HttpResponseRedirect(reverse('maps:event_detail', args=(e.id,)))
4

1 回答 1

1

首先在模型中添加一个get_absolute_url方法Event

class Event(models.Model):
    # your fields go here

    def get_absolute_url(self):
       return reverse('maps:event_detail', self.pk)

你需要做这样的事情:

from django.shortcuts import redirect

def createEvent(request):
   e = Event.objects.create(name=request.GET.get('name'),
                            reporter=request.GET.get('reporter'),
                            description=request.GET.get('description'),
                            lat=request.GET.get('lat'),
                            lon=request.GET.get('lon'),
                            timestamp=request.GET.get('timestamp'))

   return redirect(e)

create会自动保存对象;如果传递了模型的实例,快捷redirect方式会自动使用该方法。get_absolute_url

或者,您可以使用ModelForm- 如果这是用户正在输入的内容:

在名为 的文件forms.py中,添加以下内容:

from django import forms
from .models import Event

class EventForm(forms.ModelForm):
    class Meta:
        model = Event

现在您的视图变得非常简单:

from django.shortcuts import render
from .forms import EventForm

def createEvent(request):
    form = EventForm(request.POST)
    if form.is_valid():
       e = form.save()
       return redirect(e)
    return render(request, 'form.html', {'form': form})

您的模板 ( form.html) 现在是:

<form method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="submit">
</form>

由于这是一种常见模式(为模型创建新事物),django 提供了一个泛型CreateView来加快速度:

from django.generic.views import CreateView

class CreateEvent(CreateView):
     model = Event
     template_name = 'form.html'

上面所有的代码片段都执行完全相同的逻辑(除了第一个,它只是保存一个对象)。如您所见,django 为常见任务提供了快捷方式。

于 2013-09-08T06:10:33.260 回答