【发布时间】:2016-01-10 15:27:25
【问题描述】:
我是 Angular 和 Rest 的初学者,但我遇到了问题。我在 Django 模板中有一个表单,我想用 Angular 传递数据,用 Rest 接收它并处理它。 Angular 知道通过 url 将数据传递(发布)到:
url(r'^api/nowyPacjent/$', CreateNewPatient.as_view(), name="api_tempPatient"),
CreateNewPatient 类如下所示:
class CreateNewPatient(generics.ListCreateAPIView):
model = TempPatient
queryset = TempPatient.objects.all()
serializer_class = CreateNewPatientSerializer
序列化器看起来像这样:
class CreateNewPatientSerializer(serializers.Serializer):
name = serializers.CharField(max_length=30)
surname = serializers.CharField(max_length=70)
phone = serializers.CharField(max_length=15, required=False)
age = serializers.IntegerField(max_value=99, min_value=1, required=False)
company = serializers.PrimaryKeyRelatedField(many=False, queryset=Company.objects.all())
therapyStart = serializers.DateField(required=False)
def create(self, validated_data):
if 'therapyStart' in validated_data:
therapy_start = validated_data['therapyStart']
else:
therapy_start = datetime.date.today()
if 'age' in validated_data:
patient_age = validated_data['age']
else:
patient_age = 1;
if 'phone' in validated_data:
patient_phone = validated_data['phone']
else:
patient_phone = ''
newTempPatient = TempPatient(
name = validated_data['name'],
surname = validated_data['surname'],
company = validated_data['company'],
therapyStart = therapy_start,
age = patient_age,
phone = patient_phone
)
newTempPatient.save()
newPatient = Patient(
name=validated_data['name'],
surname=validated_data['surname'],
phone=patient_phone,
age=patient_age
)
newPatient.save()
user=None
request = self.context.get('request')
if request and hasattr(request,"user"):
user=request.user
newTherapyGroup = TherapyGroup.objects.create(
start = therapy_start,
patient = newPatient,
therapist = Therapist.objects.get(user = user),
company = validated_data['company']
)
newTherapyGroup.save()
return newTempPatient
一切都很好 - 在提交模板表单后,患者被创建 - 直到代码尝试从请求中获取登录用户(就在序列化程序的最后一个 if 语句之后)。然后我收到“AnonymousUser”错误,无法创建最终模型实例。我试图将数据传递给 Django 视图,然后使用 Rest 的序列化程序。但是,错误再次发生。我已经搜索了答案,但没有任何帮助。请注意,我不想对登录的用户进行身份验证,而是要获取有关他的数据。
我认为问题在于 Angular 在某种程度上松散了有关 CSRF 令牌和日志会话的信息,这就是这两个错误的原因(这只是我的假设)。
下面是 Angular 配置的样子。 NewPatientCtrl 负责提到的表单和模型是表单元素之一(它工作正常)。
angular.module('pacjent', ['ngMessages', 'ui.bootstrap', 'datetime'])
.constant('companyListApi','http://localhost:8000/finanse/api/list/')
.constant('tempPatientApi','http://localhost:8000/pacjent/api/nowyPacjent/')
.factory('ModelUtils', ModelUtils)
.factory('newPatientFormApi',newPatientFormApi )
.factory('companyApi', companyApi)
.factory('mySharedService', mySharedService)
.controller('PacjentCtrl', PacjentCtrl)
.controller('NewPatientCtrl', NewPatientCtrl)
.controller('ModalInstanceCtrl', ModalInstanceCtrl)
.config(function($interpolateProvider, $httpProvider) {
$interpolateProvider.startSymbol('{[{');
$interpolateProvider.endSymbol('}]}');
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
})
有趣的是,这段代码在我同事的系统(Windows 7、Chrome)上完美运行——用户数据被完美收集。但是,我已经在我的 PC 上的三个不同系统(Windows 7 x64、Xubuntu 14.04、Ubuntu 14)和几个浏览器(Firefox、Chromium)上对其进行了测试,并且出现了同样的错误。
非常感谢您的任何 cmets 和建议。对于任何非专业的陈述也很抱歉。
【问题讨论】: